This commit is contained in:
krahets
2023-06-26 23:13:42 +08:00
parent c0b24f1d8f
commit ce6ce9b444
5 changed files with 291 additions and 109 deletions
+3 -3
View File
@@ -10,7 +10,7 @@ comments: true
给定一个长度为 $n$ 的有序数组 `nums` ,数组可能包含重复元素。请查找并返回元素 `target` 在数组中首次出现的索引。若数组中不包含该元素,则返回 $-1$ 。
## 10.2.1.   简单方法
## 10.2.1.   线性方法
为了查找数组中最左边的 `target` ,我们可以分为两步:
@@ -21,11 +21,11 @@ comments: true
<p align="center"> Fig. 线性查找最左边的元素 </p>
这个方法虽然有效,但由于包含线性查找,**其时间复杂度可能会劣化至 $O(n)$**
这个方法虽然有效,但由于包含线性查找,时间复杂度 $O(n)$ ,当存在很多重复的 `target` 时效率较低
## 10.2.2. &nbsp; 二分方法
实际上,我们可以仅通过二分查找解决以上问题。整体算法流程不变,先计算中点索引 $m$ ,再判断 `target``nums[m]` 大小关系:
考虑仅使用二分查找解决问题。整体算法流程不变,先计算中点索引 $m$ ,再判断 `target``nums[m]` 大小关系:
-`nums[m] < target``nums[m] > target` 时,说明还没有找到 `target` ,因此采取与上节代码相同的缩小区间操作,**从而使指针 $i$ 和 $j$ 向 `target` 靠近**。
-`nums[m] == target` 时,说明“小于 `target` 的元素”在区间 $[i, m - 1]$ 中,因此采用 $j = m - 1$ 来缩小区间,**从而使指针 $j$ 向小于 `target` 的元素靠近**。