Leetcode.704 二分查找 基于代码随想录的教学思路

32 阅读2分钟
二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。它通过反复将搜索区间减半来工作,时间复杂度为 O(log n) 。前提条件需要有序数组
在这个有序数组中,我们在它的两个边界设置左右指针,并计算左右指针的出的中值,将这个中值middle与目标值target比较,如果middle>target 说明target在middle左侧,则移动right指针至middle处并循环上述操作,直到target值与middle匹配。

题目:

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

在这道题中 Carl首先抛出了二分法的两个关键问题:

  1. 写while循环时 left<right or left<=right ?
  2. 在改变指针时 如改变右指针 是让right=middle 还是 right=middle-1

首先,主要的区间定义方式有两种 左闭右闭 [left,right] 和 左闭右开 [left,right)

我们以左闭右闭 [left,right]为例

二分查找.png

现在我们来解决这两个问题

当区间是这样一个闭区间时 left显然可以等于right 所以while(left<=right),等号是可以取到的,循环的边界值是要取的 我们假设target在初始middle的左侧 第一次middle与target不匹配时 right开始移动 如果我们将它放在原middle处,因为边界值可取,就造成了浪费(middle已知不等于target),所以此时我们要让right移动到middle-1处 这样就避免了资源浪费 同时因为边界值可取 我们也不会漏掉某个数。

简而言之,就是通过区间知道了边界值只是可以取,通过循环条件知道了边界值不满足target所以不取边界值。

个人学习笔记仅供参考