题意
给定一个有序数组a[],和一个目标数字target,求target在a[]中出现的范围。
思路
最先想用lower_bound
和upper_bound
随便搞一样,但是想了一样既然在学二分就好好写二分吧。其实这个题里面两个二分的区别就在于取等号的不同。
细节
当a[m] = target
的时候不能直接返回,因为我们要找的是最边界的那两个点。
代码
class Solution {
public:
int l_bs(vector<int>& a, int target) {
int l = 0, r = a.size() - 1, m, ans = -1;
while (l <= r) {
m = l + (r - l >> 1);
if (a[m] < target) l = m + 1;
else r = m - 1, ans = m;
}
return ans >= 0 ? (a[ans] == target ? ans : -1) : -1;
}
int h_bs(vector<int>& a, int target) {
int l = 0, r = a.size() - 1, m, ans = -1;
while (l <= r) {
m = l + (r - l >> 1);
if (a[m] <= target) l = m + 1, ans = m;
else r = m - 1;
}
return ans >= 0 ? (a[ans] == target ? ans : -1) : -1;
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
ans.push_back(l_bs(nums, target));
ans.push_back(h_bs(nums, target));
return ans;
}
};