1、题目:在排序数组中查找元素的第一个和最后一个位置
2、解题思路
排序数组寻找元素,很容易可以想到可以用二分法进行查找,所以我们分别找到左边界和右边界。二分法最重要的是确定区间,并保持区间的一致性。
3、代码
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target)
{
int leftBorder = getLeftBorder(nums, target);
int rightBorder = getRightBorder(nums, target);
if (leftBorder == -2 || rightBorder == -2)
return {-1, -1};
if (rightBorder - leftBorder > 1)
return {leftBorder + 1, rightBorder - 1};
return {-1, -1};
}
private:
int getRightBorder(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size() - 1;
int rightBorder = -2; // 记录一下rightBorder没有被赋值的情况
while (left <= right)
{
int middle = left + ((right - left) / 2);
if (nums[middle] > target)
{
right = middle - 1;
}
else
{ // 寻找右边界,nums[middle] == target的时候更新left
left = middle + 1;
rightBorder = left;
}
}
return rightBorder;
}
int getLeftBorder(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size() - 1;
int leftBorder = -2; // 记录一下leftBorder没有被赋值的情况
while (left <= right)
{
int middle = left + ((right - left) / 2);
if (nums[middle] >= target)
{ // 寻找左边界,nums[middle] == target的时候更新right
right = middle - 1;
leftBorder = right;
}
else
{
left = middle + 1;
}
}
return leftBorder;
}
};