版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kukubao207/article/details/78041183
最近在做Leetcode的题,专题训练,每天做5道差不多,所以也在博客上记录一下题解吧。
今天做了几道二分查找的题,主要是二分查找的各种变形,都要掌握。
1.最原始的二分查找,返回key的下标,无则返回-1。
2.数组中有重复元素,返回第一个key的下标,无则返回-1。
3.数组中有重复元素,返回最后一个key的下标,无则返回-1。
4.返回刚好小于key的元素下标,无则返回-1。
5.返回刚好大于key的元素下标,无则返回-1。
在这道题中,输入为一个升序数组和一个key,要求返回该数组中key的范围下标,因此此题转化为求解 key第一次和最后一次出现的下标,可采用 2和3的方法。
代码如下所示:
注意 i<j 而不是i<=j
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ret(2,-1);
if(nums.empty())
return ret;
int i=0,j=nums.size()-1;
while(i<j)
{
int m=(i+j)/2;
if(nums[m]<target)
i=m+1;
else if(nums[m]>target)
j=m-1;
else
j=m;
}
if(nums[i]!=target)
return ret;
else
ret[0]=i;
j=nums.size()-1;
while(i<j)
{
int m=(i+j)/2+1;
if(nums[m]>target)
j=m-1;
else if(nums[m]<target)
i=m+1;
else
i=m;
}
ret[1]=j;
return ret;
}
};