二分法
二分法的使用:
有序数组,且数组中无重复元素,那么就可以考虑使用二分法。
其难点主要在于区间的确立,是while(left<right)呢,还是while(left<=right)呢?
在定义新的right时,是right = middle -1呢还是right = middle呢?
解决方法:坚持一个循环不变量,若使用左闭右闭区间,即【left,right】时,由于左右边界相等合法,所以使用while(left<=right),求数组长度时,就要用nums.size()-1;
更新左右边界时,就要使用right = middle-1,left = middle+1
若使用左闭右开区间,即【left,right)时,由于左右边界相等不合法,所以使用while(left<right),求数组长度时,就要用nums.size(),更新左右边界时,使用right = middle,left = middle+1。
举例,LeetCode.704(二分查找)
代码如下:
int search(vector<int>& nums, int target) {
int left = 0;
int middle = 0;
int right = nums.size() - 1;
while(left <= right){
middle = left + (right - left)/2;
if(nums[middle] > target){
right = middle - 1;
}
else if(nums[middle] < target){
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}

浙公网安备 33010602011771号