递增序列,可能有重复,用二分法查找目标数的又边界。给出代码,请纠正错误(可能不只一处)
int MyBinSearch(vector<int> nums, int target) {
int left = 0;
int right = nums.size();
while(left < right) {
int mid = (left + right) / 2;
if(nums[mid] <= target) {
left = mid+1;
} else {
right = mid-1;
}
}
if(nums[right] == target)
return right;
return -1;
}
考场上没有想清楚,于是回来把题默写出来。明天要去面试了,想起了这道题。上网搜了一下,leetcode有34. Find First and Last Position of Element in Sorted Array。于是在leetcode上实现了自己的想法:
int MyBinSearch(vector<int> nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left < right) {
int mid = (left + right+1) / 2; // 修改,倾向找右边界,同时避免死循环
if(nums[mid] <= target) {
left = mid; // 修改,确定目标所在范围
} else {
right = mid-1;
}
}
// 需要加判定数组是否为空代码
// ...
if(nums[right] == target)
return right;
return -1;
}
leetcode是要求找左右边界,左边界我很巧妙地对偶了,这是我凭直觉碰出的代码,AC后截取出上面代码,应该没问题。
这道题应该有其它写法,例如https://blog.youkuaiyun.com/IronWring_Fly/article/details/100548061 我还没好好看,需要进一步理解与尝试,所以leetcode这道题改天再做一下,评论区肯定有更好的代码。