代码随想录--704.二分查找(力扣)

二分查找

对于二分查找,感觉自己写的并不全面,暂时通过一道力扣题,来解释一下吧。希望后面可以补充的up主,通过私信或者评论来进行补充。

704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二分查找:也称折半查找,在一段足够长的数据中,通过以下三步来完成对一个数据的快速查找:

  1. 通过这段数据的开头结尾,寻找到这段数据的中间值
  2. 将搜寻到的中间值目标值进行比较,若中间值大于目标值,则说明目标值在整段数据的靠左侧;若中间值小于目标值,则说明目标值在整段数据的靠右侧;若等于,则说明直接找到
  3. 若在第2步中未找到目标值,则通过在第2步中的判断,来缩小搜索的数据段。在第2步中,若得到的结果是:目标值在整段数据的靠左侧,重新定位数据段的,通过新的,来求出新的中间值,继续重复以上1、2、3步骤,直至找到目标值;若得到的结果是:目标值在整段数据的靠右侧,重新定位数据段的,通过新的,来求出新的中间值,继续重复以上1、2、3步骤,直至找到目标值。
    本题的代码如下:
 class Solution {
    public int search(int[] nums, int target) {
        // 定义 头:left,尾:right
        int left = 0;
        int right = nums.length - 1;
        // 若 头 <= 尾, 则说明,数据段未搜索完 
        while(left <= right){
            // 根据 left right,找出数据段的中间值:mid
            int mid = (right + left) / 2;
            // 若目标值小于中间值,则重新定义尾right
            // 若目标值大于中间值,则重新定义头left
            if(nums[mid] > target){
                right = mid-1;
            }else if(nums[mid] < target){
                left = mid+1;
            }else{
                // 当前两个条件都不满足时,此时满足 中间值=目标值, 直接输出此时的下标
                return  mid;
            }
        }
        return -1;
    }
}

注意

  1. 看清循环判断的条件,当left与right相等时,说明还有一个数据未比较,故此时还需要进行比较,不能跳出循环;
  2. 确定好重新定义的条件,是目标值小于中间值,此时,因为中间值已经比较过,故将设置为中间值的前一位
  3. 确定好重新定义的条件,是目标值大于中间值,此时,因为中间值已经比较过,故将设置为中间值的后一位

你可能感兴趣的:(leetcode,算法,职场和发展)