二分查找,总结备忘(模板、结论、证明)

以非降序数组举例
(虽然只举了两例子,但是只要看懂证明应该就能举一反N)


模板一:

        while(lo<hi){
    
    
            mi = (lo+hi)>>1;
            target<nums[mi]?hi=mi:lo=mi+1;
        }

(注:以下文字叙述中"=“代表等号,”:="代表赋值号)

结论: 循环结束时 lo=hi,nums的[lo, length)区间内的所有元素>target,nums的[0,lo)区间内所有元素<=target;
nums[lo-1]可能等于target,也可能小于target;
lo可能为0,表示target<数组所有的元素;
lo可能为nums.length,表示target>=数组的所有的元素。

证明: 当target<nums[mi]时,令hi := mi; 此时nums[hi]>target, 保证了 [hi, length) 区间内的元素都>target。
当 target>=nums[mi] 时,令lo := mi+1; 此时nums[lo-1]<=target,保证了 [0, lo) 区间的的元素都<=target。


模板二:

        while(lo<hi){
    
    
            mi = (hi+lo)>>1;
            target<=nums[mi]?hi=mi:lo=mi+1;
        }

(注:以下文字叙述中"=“代表等号,”:="代表赋值号)

结论: 循环结束时 lo=hi,nums的[0,lo)区间内所有元素<target,nums的[lo,length) 区间的所有元素>=target;
nums[lo]可能等于target,也可能大于target;
lo可能为0,target<=数组的所有元素;
lo可能为nums.length,target>数组的所有元素。

证明: 当target<=nums[mi]时,令hi := mi; 此时nums[hi]>=target, 保证了 [hi, length) 区间内的元素都>=target。
当 target>nums[mi] 时,令lo := mi+1; 此时nums[lo-1]<target,保证了 [0, lo) 区间的的元素都<=target。

猜你喜欢

转载自blog.csdn.net/wx_assa/article/details/104464975