题目
Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
代码(首刷调试看解析)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
if(n == 0)
return {-1, -1};
int low = 0, high = n-1;
vector<int> ans;
int mid = -1;
while(low <= high) {
mid = (low + high) / 2;
if(nums[mid] < target) { // 搜索区间变为 [mid+1, right]
low = mid+1;
} else if(nums[mid] > target) { // 搜索区间变为 [left, mid-1]
high = mid-1;
} else { // 搜索区间变为 [left, mid-1]
high = mid - 1;
}
}
// 判断 target 是否存在于 nums 中
// 此时 target 比所有数都大,返回 -1
if(low == n)
return {-1, -1};
if(nums[low] == target) {
// 判断ans[low]是否等于target(有可能这个数不在nums中)
ans.push_back(low);
} else {
return {-1, -1};
}
// 找到右边界
while(low+1 < n && nums[low] == nums[low+1])
low++;
ans.push_back(low);
return ans;
}
};
代码(二刷看解析)
这是标准找左边界和有边界的题目
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
int left_bound = -1, right_bound = -1;
// 左边界
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else {
right = mid - 1;
}
}
if(left >= nums.size() || nums[left] != target) // 注意判断条件要在外面
left_bound = -1;
else left_bound = left;
// 右边界
left = 0, right = nums.size() - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] < target) {
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
if(right < 0 || nums[right] != target)
right_bound = -1;
else
right_bound = right;
return {left_bound, right_bound};
}
};
代码(9.18 三刷自解)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size()==0)
return {-1,-1};
int left = 0, right = nums.size()-1;
while(left < right) {
int mid = (left+right)/2;
if(nums[mid] < target) {
left = mid+1;
} else {
right = mid;
}
}
if(nums[left] != target) {
return {-1, -1};
}
int left_bound = left;
while(left+1 < nums.size() && nums[left] == nums[left+1]) left++;
return {left_bound, left};
}
};