Leetcode_34. Search for a Range

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
       
    }
};



猜你喜欢

转载自blog.csdn.net/kukubao207/article/details/78041183