二分查找专题训练

一、二分查找法模板

模板一

public binarySearch() {
    while(left < right) {
        mid = (right - left) >>> 1;
        if(check(mid)) {
            left = mid + 1;
        }else {
            right = mid;
        }
    }
}

模板二

public binarySearch() {
    while(left < right) {
        mid = (right - left + 1) >>> 1;
        if(check(mid)) {
            right = mid - 1;
        }else {
            left = mid;
        }
    }
}

 解释说明:

①while(left < right)

这样查找结束的条件就是left == right,就不需要纠结返回left还是right。如果题意说明二分查找必有答案,直接返回即可;若二分查找可能没有答案,也只需要在结尾作一下判断就好。

②取中位数

mid = (rigth - left) >>> 1使用无符号右移的好处

a 位移操作符要比除法执行的快

b 无符号右移在高位补0,在除法移除的时候也能够得到正确的答案

补充说明:

左移:低位补0;

逻辑右移(无符号右移):高位补0;

算数右移(有符号右移):高位补符号位

③在写分支时,优先写好想的、能够排除mid的,难想的直接else

注意取左中位数 mid = (right - left)  >>> 1   要的对应left = mid + 1;

取有中位数 mid = (right - left + 1)  >>> 1 要对应right = mid - 1;

这样可以有效的避免死循环。

猜你喜欢

转载自www.cnblogs.com/mgblogs/p/11712490.html