时间轴

2025-12-04

init


题目:

核心思路
我们在搜索过程中 不断缩小搜索区间。

  • 当 nums[mid] >= target 时:target 可能在 mid 左边,所以把 right = mid - 1。
  • 当 nums[mid] < target 时:target 在 mid 右边,所以 left = mid + 1。
  • 每次遇到 nums[mid] == target 就记录 index = mid。

当循环结束时,left 超过了 right。最后记录的 index 一定是 满足 nums[index] == target 的最左位置:因为每次遇到 target 时,我们仍然尝试向左缩小区间(right = mid - 1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <vector>
using std::vector;

class Solution {
public:
vector<int> searchRange(vector<int> &nums, int target)
{
int n = nums.size();
int left = 0, right = n - 1;
int mid;

vector<int> res;
int index = -1;
while (left <= right) { //查找左边界
mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
if (nums[mid] == target)
index = mid;
}

res.push_back(index);

left = 0;
right = n - 1;
index = -1;
while (left <= right) { // 右边界
mid = left + (right - left) / 2;
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid - 1;
}
if (nums[mid] == target)
index = mid;
}
res.push_back(index);

return res;
}
};