题解 | #二分查找-I#

二分查找-I

https://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

简单的二分查找

前提:数组有序(可先排序),无重复数组(可单独处理)

1. 一般使用左闭右开区间,感觉代码容易一点点,不要记太多的套路,直接一套带走,左闭右开

2. 二分查找特别需要注意左右的区间: 这里很容易写错,所以最好的办法是在纸上画一个数组,要记住边界的限定,时刻在心中默念,左闭右开无等号,有闭有加,无闭无加
while (left < right)//无等号
left = mid + 1;//左闭
right = mid; //右开

3. 最后一点就是middle的值了,这里需要注意一点的就是,防止超出int类型的最大值,只需要记住,防超出用减号:
 int mid = left + ((right - left) / 2)

左闭右闭:

  1. while(left <= right), 因为当left == right 的时候是有意义的

  2. if(nums[middle] > target), right要赋值为middle-1,因为当前这个nums[middle] 一定不是target,那么接下来要查找的左右区间结束下标位置就是middle-1


代码:左闭右闭区间

左闭右开:[left, right)
class Solution {
    public int search(int[] nums, int target) {
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) {
            return -1;
        }
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1; //左闭右闭
        }
        return -1;
    }
}  
  1. while(left < right), 使用<, 因为left==right在区间中是没有意义的

  2. if(nums[midlle] > target), right 更新为middle, 因为当前nums[middle]不等于target, 去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle, 即:下一个查询区间不会去比较nums[middle]

代码:左闭右开区间

class Solution {
    public int search(int[] nums, int target) {
        int left = 0, right = nums.length;
        while (left < right) {//左闭右开区间
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid; //左闭右开区间
        }
        return -1;
    }
}  
全部评论

相关推荐

今天 11:18
门头沟学院 Java
作者先叠个甲:本人双非本,秋招拿到了多个大厂offer,这个过程也不容易,但是在看到很多秋招胜利之后说自己一路有多艰辛的文章,总感觉有一点不对劲,想了很久打算写一篇文章分析一下,本文仅代表作者观点,不认同的可以在评论区大家一起理性讨论。&nbsp;秋招已经结束,各类社交平台出现一大批“大厂上岸”胜利结算。文章的叙事逻辑高度相同,开篇就渲染焦虑和困惑,学习时的挑灯夜读、投递时的屡屡碰壁、面试时的如履薄冰,将过往经历包装成一步艰辛的“奋斗史”,然后最终以大厂offer的胜利结尾,字里行间全是苦尽甘来的优越感。但是在我看来,这类文章的本质是结果导向的、带有浮夸的叙事,因为其内核不是分享经验,而是借“苦难”之名...
创作小队长:你的批判视角非常犀利,尤其“结果决定叙事权”的洞察非常精准,哈哈想邀请你来成为我们的创作者🫰 但我想补充一个视角:许多分享者的初衷并非炫耀结果或者苦难,我更愿意相信他们在这个过程中付出了很多,在这场战役结束后,他们迫不及待地想被看到,记录和分享都是给自己的一个交代,而非真的教会别人什么,他们的初衷未必是想制造焦虑。求职市场的残酷、经济环境的下行、世俗价值观才是这种叙事流行的土壤,作为一个普通人无法抵抗洪流。 感谢你发起这场讨论。理想的社区,既需要这样锐利的批判来保持清醒,你的洞察非常犀利,也许会启发一些人,能逐渐改变这种叙事~
点赞 评论 收藏
分享
评论
9
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务