题目

LeetCode 34.在排序数组中查找元素的第一个和最后一个位置
代码
class Solution {
int lower_bound(vector<int>& nums, int target){
int left = 0, right = nums.size() - 1;
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] >= target) right = mid - 1;
else left = mid + 1;
}
return left;
}
public:
vector<int> searchRange(vector<int>& nums, int target) {
int start = lower_bound(nums, target);
if(start == nums.size() || nums[start] != target) return {-1, -1};
int end = lower_bound(nums, target + 1) - 1;
return {start, end};
}
};
总结
1、采用二分法的找第一个出现的数target为左边界,即nums[mid]>=target的第一个数;最后一个出现的数target为右边界,其实相对于找第一个出现的>=target+1的位置,再减1就是右边界。
2、对于常见四种情况的总结

关键点1:分割线最终停靠的位置取决于nums[mid] = target时的处理。若令left = mid + 1,分界线最终会停靠在区间最右侧,此时是right刚好指向最右侧(比如最后一个8)(因为最后会进行一次left = mid + 1);若令right = mid - 1,分界线则会停靠在区间最左侧(比如第一个8),同理此时left指向区间最左侧。

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



