二分查找专题训练
一、二分查找法模板
模板一
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;
这样可以有效的避免死循环。