LeetCode34——Search for a Range
题意:
在有序序列中找到重复出现的数字出现的范围,返回一个二元组代表范围的闭区间,如果找不到target则返回[-1,-1]
连续考察二分查找的应用,这里的思路就是使用两次二分查找,分别找出上界和下界,如果nums[low]==target,则下界索引就是low,否则为-1,上界求解方法类似。
感觉这道题目的难点就是对标准二分查找的修改,并获取查找成功时 索引low和索引high的状态。
然后注意注释中求解上界时候的注释,很关键。
代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
int low = 0;
int high = len - 1;
int mid;
int resNum1;
int resNum2;
vector<int> result;
while (low < high)// 二分查找上界
{
int mid = low + (high - low) / 2;
if (nums[mid] < target)
{
low = mid + 1;
}
else
high = mid;
}
resNum1 = nums[low] == target ? low : -1;
low = 0;
high = len - 1;
while (low < high)//二分查找下界
{
int mid = low + (high - low+1) / 2;//!!!!!若nums[mid]<=target时,若此时low+1==high,进入死循环
if (nums[mid] > target)
{
high = mid - 1;
}
else
low = mid;
}
resNum2 = nums[high] == target ? high : -1;
result.push_back(resNum1);
result.push_back(resNum2);
return result;
}
};