题意
给定一个有序数组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;
}
};

本文介绍了一个使用二分查找算法解决的问题:在一个有序数组中找到特定目标值首次和末次出现的位置。通过两个定制化的二分查找函数,分别定位目标值的左边界和右边界。
&spm=1001.2101.3001.5002&articleId=55003305&d=1&t=3&u=18c30d861c3248458d126eb163064ebb)
239

被折叠的 条评论
为什么被折叠?



