引言
在排序数组中查找元素的第一个和最后一个位置
- 🎈 题目链接:
- 🎈 做题状态:
我的解题
关于二分查找判断条件修改,可以定位目标值左右边界的讲解,在【Hot 100】二分查找(单个目标值:查找目标值、多个目标值:查找目标值左右边界)文章中有详细的说明。可以参考那篇文章。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if (nums.size() == 0) return {-1, -1};
// 用二分法找出第一个比target小的,然后找出第一个比target大的元素索引。
int left = 0;
int right = nums.size() - 1;
while(left <= right)
{
int mid = (right - left) / 2 + left;
if (nums[mid] <= target)
{
// 小于等于目标值,移动左边界
left = mid + 1;
} else if (nums[mid] > target)
{
// 大于目标值
right = mid - 1;
}
}
// 此时right指向的是右边界
int rBound = right;
left = 0;
right = nums.size() - 1;
while(left <= right)
{
int mid = (right - left) / 2 + left;
if (nums[mid] < target)
{
// 小于目标值
left = mid + 1;
} else if (nums[mid] >= target)
{
// 大于等于目标值
right = mid - 1;
}
}
// 此时 left 指向的是左边界
int lBound = left;
// 如果两个边界相减小于等于1,则说明没有目标值
if (rBound - lBound < 0) return {-1, -1};
return {lBound, rBound};
}
};