二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法。它通过反复将搜索区间减半来工作,时间复杂度为 O(log n) 。前提条件需要有序数组
在这个有序数组中,我们在它的两个边界设置左右指针,并计算左右指针的出的中值,将这个中值middle与目标值target比较,如果middle>target 说明target在middle左侧,则移动right指针至middle处并循环上述操作,直到target值与middle匹配。
题目:
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果 target 存在返回下标,否则返回 -1。
在这道题中 Carl首先抛出了二分法的两个关键问题:
- 写while循环时 left<right or left<=right ?
- 在改变指针时 如改变右指针 是让right=middle 还是 right=middle-1
首先,主要的区间定义方式有两种 左闭右闭 [left,right] 和 左闭右开 [left,right)
我们以左闭右闭 [left,right]为例
现在我们来解决这两个问题
当区间是这样一个闭区间时 left显然可以等于right 所以while(left<=right),等号是可以取到的,循环的边界值是要取的 我们假设target在初始middle的左侧 第一次middle与target不匹配时 right开始移动 如果我们将它放在原middle处,因为边界值可取,就造成了浪费(middle已知不等于target),所以此时我们要让right移动到middle-1处 这样就避免了资源浪费 同时因为边界值可取 我们也不会漏掉某个数。
简而言之,就是通过区间知道了边界值只是可以取,通过循环条件知道了边界值不满足target所以不取边界值。
个人学习笔记仅供参考