二分法

二分法的使用:

有序数组,且数组中无重复元素,那么就可以考虑使用二分法。

其难点主要在于区间的确立,是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;
    }

 

posted @ 2022-09-29 20:16  Dhw不爱Cpp  阅读(77)  评论(0)    收藏  举报