0%

34.在排序数组中查找元素的第一个和最后一个位置

题目

在排序数组中查找元素的第一个和最后一个位置

标签

二分查找模板

思路

使用二分算法的两个模板分别可以求出元素出现的第一个位置和最后一个位置。

题解

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
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
if(nums.size() == 0){
res.push_back(-1);
res.push_back(-1);
return res;
}
int l = 0, r = nums.size() - 1;
while(l < r){ //第一个模板
int mid = (l + r) >> 1;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
if(nums[l] != target){
res.push_back(-1);
res.push_back(-1);
}else{
res.push_back(l);
l = 0, r = nums.size() - 1;
while(l < r){ // 第二个模板
int mid = (l + r + 1) >> 1;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
res.push_back(r);
}
return res;
}
};
  • 时间复杂度:O(log n),其中 n 为数组的长度。二分查找的时间复杂度是O(log n),一共执行两次,所以总的时间复杂度是O(log n)
  • 空间复杂度:O(1),只需要常数空间存放若干变量

执行用时:4 ms, 在所有 C++ 提交中击败了93.27%的用户

内存消耗:13.3 MB, 在所有 C++ 提交中击败了34.09%的用户

通过测试用例:88 / 88

正在加载今日诗词....