【数组】力扣704二分查找
2024-01-10 06:03:34
题目
思路
首先当看到有序的,升序的,没有重复的元素,那么就要想到使用二分查找方法。
其次要确认的就是把握边界
问题,二分查找中,边界的控制十分重要。我们要确认是左闭右闭 []
,还是左闭右开 [)
。在二分查找的过程中,要保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则
。
代码实现
版本一:左闭右闭 []
public int search(int[] arr, int target) {
int left = 0;
ing right = arr.length - 1;
// 这里我们要想是left<right,还是<=呢?
// 我们确认的区间是左闭右闭,那么当left = right的时候,也是在这个区间里,也是合法的,所以是<=
while(left <= right) {
// 计算出中间索引middle
int middle = (left + right) / 2;
// 如果中间索引上的这个元素大于目标值,说明target存在于左区间,要移动right索引
if(arr[middle] > target) {
// 为什么是middle-1呢?我们想arr[middle]已经大于了target,那么middle位置这个元素就不用再算了,
// 直接比较middle的下一个位置就可以了,所以把right变为middle - 1即可
right = middle - 1;
} else if(arr[middle] < target) { // 说明target处于右区间,移动left索引
// 参考上面解释
left = middle + 1;
} else {
return middle;
}
}
// 走到这里说明没找到符合的元素,返回-1
return -1;
}
版本二:左闭右开 [)
public static int search(int[] arr, int target) {
// 左闭右闭 [ ]
int left = 0;
int right = arr.length - 1;
// 因为采用的是左闭右开,所以当left = right的时候 是没有意义的
while (left < right) {
// 计算middle中间值索引
int middle = (left + right) / 2;
// 中间值大于目标值,说明target处于左区间,移动right
if (arr[middle] > target) {
// 注意左闭右开[)
right = middle;
} else if (arr[middle] < target) {
// 注意左闭右开[)
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
推荐刷题
刷完二分查找,掌握其思想,推荐刷下面题目练手,进一步掌握。
保持一天两道即可
力扣35:搜索插入位置
力扣34:在排序数组中查找元素的第一个和最后一个位置
参考
文章来源:https://blog.csdn.net/weixin_44078354/article/details/135410249
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!