【刷题5】在排序数组中查找元素的第一个和最后一个位置
目录
- 一、题目解析
- 二、思路—二分查找(二段性)
- 1、查找最左端区间
- 2、查找最右端区间
- 三、代码
一、题目解析
题目理解:
返回begin和end,是数组下标
二、思路—二分查找(二段性)
1、查找最左端区间
left和right移动问题:
循环条件问题:
只能是left<right,一旦相等就会死循环。或者说left=right就终止了。
取中点问题:
2、查找最右端区间
与查找左端类似
left和right移动问题:
循环条件问题:left<right
取中点问题:取第二种
三、代码
细节1:如果数组没有元素,直接返回-1-1;
细节2:如果找完左端没有left=nums[mid],也是直接返回-1-1
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret;
int n = nums.size();
if(n == 0) return {-1, -1};
// 左
int left = 0, right = n-1, L = -1, R = -1;
while(left < right)
{
int mid = left+(right-left)/2;
if(nums[mid] < target)
{
left = mid+1;
}
else
{
right = mid;
}
}
if(nums[left]!=target) return {-1, -1};// 细节注意
else L = left;
ret.push_back(L);
// 右
left = 0, right = n-1;
while(left < right)
{
int mid = left+(right-left+1)/2;
if(nums[mid] <= target)
{
left = mid;
}
else
{
right = mid - 1;
}
}
R = left;
ret.push_back(R);
return ret;
}
};