这是我参与「掘金日新计划 · 2 月更文挑战」的第 1天,点击查看活动详情”
二分查找法
二分查找法(折中算法,设定一个中间的middle值)
在进行搜索的时候要对区间的定义比较明确
左闭右闭,左闭右开、左开右闭(前两者用的居多)
左闭右闭:left、right值都包括
左闭右开:left包括,right不包括
在循环中对边界做明确的定义。
左闭右闭二分法的代码:
当数组(middle大于target的时候,target在middle的left方位,所以查找的right的范围肯定不包括middle,且小于middle,所以middle-1)
当数组(middle小于target的时候,target在middle的right方位,所以查找的left的范围肯定不包括middle,且大于middle,所以middle+1)
如果是左闭右开区间,假设left等于1,right也等于1,左边界包含1,右边界不包含1,明显是个不合法的区间,所以left与right不相等
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
在升序数组 nums 中寻找目标值 target,对于特定下标 i(折中middle),比较 nums[i] 和 target 的大小:
-
如果 nums[i]=target,则下标 i 即为要寻找的下标;
-
如果 nums[i] > target,则 target 只可能在下标 i 的左侧;
-
如果nums[i]<target,则 target 只可能在下标 i 的右侧。
复杂度分析
- 时间复杂度:O(\log n)O(logn),其中 nn 是数组的长度。
- 空间复杂度:O(1)O(1)。