二分查找
思想
找到中间值,再对比查找;通过不断移动中值,最后找到结果。
代码实现
// target是被查找值,num是被查找序列
int left = 1; // left取决于是索引还是第一个值,同理right也是
int right = num - 1;
int mid;
while (left <= right) {
mid = left + (right - left) >> 1;
if (mid == target) {
// do something
} else if (mid > target) {
right = mid - 1;
// do something
} else {
left = mid + 1;
// do something
}
}
发明一个并不朗朗上口的口诀以节省我拮据的脑容量:中值大右往左,中值小左往右。
例题
- 704. 二分查找(Easy)
- 69. x 的平方根(Easy)
- 167. 两数之和 II - 输入有序数组(Easy)
- 278. 第一个错误的版本(Easy)
- 367. 有效的完全平方数(Easy)
- 374. 猜数字大小(Easy)
- 441. 排列硬币(Easy)
- 852. 山脉数组的峰顶索引(Easy)
总结
- 注意mid赋值应为
mid= left + (right - left) / 2;
,防止溢出;但在数组元素较少时可直接mid= (right + left) / 2;
更简洁; - 在看374. 猜数字大小(Easy)题解时发现使用移位运算
>>1
会比除法/2
快速,故可以更新mid= left + (right - left) / 2;
为mid = left + (right - left) >> 1;
- 界限是
left<=right
,分情况取“=”。