1. 题意
给定一个非递减的数组,找出给定元素的开始位置和
结束位置。
2. 题解
题目要求复杂度为 log ( n ) \log (n) log(n), 因此不能用双指针了。
这个题目练习二分挺好的。
2.1 双指针
还是把双指针的写下来吧。
cpp
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int sz = static_cast<int>(nums.size());
int bg = -1;
int ed = -1;
for (int i = 0; i < sz; i++) {
if (bg == -1 && nums[i] == target)
bg = i;
if (target == nums[i])
ed = i;
}
return vector<int>{bg, ed};
}
};
2.2 二分查找
lowerbound
查找第一个,upper_bound
查找最后一个的后面。
cpp
class Solution {
public:
int lbound(vector<int> &a, int target) {
int l = -1;
int r = static_cast<int>(a.size()) - 1;
while (r - l > 0) {
int mid = l + ((r - l + 1) >> 1);
if (a[mid] < target)
l = mid;
else
r = mid - 1;
}
return r + 1;
}
int ubound(vector<int> &a, int target) {
int l = -1;
int r = static_cast<int>(a.size()) - 1;
while ( r - l > 0) {
int mid = l + ((r - l + 1) >> 1);
if (a[mid] <= target)
l = mid;
else
r = mid - 1;
}
return r + 1;
}
vector<int> searchRange(vector<int>& nums, int target) {
auto bi = lower_bound( nums.begin(), nums.end(), target);
if ( bi == nums.end() || *bi > target)
return vector<int>{ -1, -1};
auto ui = upper_bound( nums.begin(), nums.end(), target);
int bg = bi - nums.begin();
int ed = ui - nums.begin();
return vector<int>{bg, ed - 1};
}
};