1. 题意
给定一个非递减的数组,找出给定元素的开始位置和
结束位置。
2. 题解
题目要求复杂度为 log ( n ) \log (n) log(n), 因此不能用双指针了。
这个题目练习二分挺好的。
2.1 双指针
还是把双指针的写下来吧。
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
查找最后一个的后面。
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};}
};