题目链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/
与典型二分不同,搜到之后还要接着搜。最开始我的思路是搜到一个之后在两边继续二分,但是这样太乱了。之后受启发可以分别求两端点,定义一个二分函数,找到之后根据参数确定下一步往哪边继续搜索。
代码如下:
class Solution {
public:
int B_S(vector<int> nums, int target, bool way) {
bool found = false; //找到了要记录,否则最后返回-1
int l = 0, r = nums.size() - 1;
while(l <= r) {
int mid = (l + r) / 2;
// way = true表示寻找左端点,= false表示寻找右端点
if((nums[mid] == target && way) || nums[mid] > target) {
if(nums[mid] == target) {
found = true;
}
r = mid - 1;
} else {
if(nums[mid] == target) {
found = true;
}
l = mid + 1;
}
}
return found ? (way ? l : r) : -1;
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res;
res.push_back(B_S(nums, target, true));
res.push_back(B_S(nums, target, false));
return res;
}
};