个人主页:Ice_Sugar_7
所属专栏:算法详解
欢迎点赞收藏加关注哦!
啥时候用二分算法?
这么说肯定会觉得抽象,没事儿,后面做题慢慢体会
不过现在需要知道:不一定要数据有序才能用二分查找,只要能以某个点将区间分成两段就可以了(简称为“二段性”)
left
和 right
,分别指向数组的起始位置和最后一个位置所以,当 left > right
时,循环才结束
由数学知识可得 mid = (left + right)/ 2
但是如果 left 和 right 很大的话,很可能会溢出,所以比较稳妥的写法是 mid = left + (right - left)/ 2
,即左端点加上区间长度的一半
如果一共有奇数个元素,那么 mid 就是正中间那个;如果有偶数个,那就有两个中点,上面那两个式子算出来的是靠左边的中点
而如果要找靠右边的中点,只需加个1:mid = (left + right + 1)/ 2
和 mid = left + (right - left + 1)/ 2
来道简单题,它的答案就是模板:
二分查找
class Solution {
public int search(int[] nums, int target) {
int left = 0,right = nums.length-1;
while(left <= right) {
int mid = left+(right-left)/2;
if(nums[mid] < target) left = mid+1;
else if(nums[mid] > target) right = mid - 1;
else return mid;
}
return -1;
}
}
模板为:
public int search(int[] nums, int target) {
int left = 0,right = nums.length-1;
while(left <= right) {
int mid = left+(right-left)/2;
if(...) left = mid+1;
else if(...) right = mid - 1;
else return ...;
}
return -1;
}
使用时,把省略号处的内容填充上就ok了