34.Search for a Range

Given a sorted array of integers, find the starting and ending position of a given target value.

Your algorithm's runtime complexity must be in the order of O(log n).

If the target is not found in the array, return [-1, -1].

For example,
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].

思路1:二分查找找到等于target的位置,再寻找target的左右边界,注意别越界!

class Solution {
public:
   vector<int> searchRange(vector<int>& nums, int target) {
       int temp[] = { -1, -1 };
       vector<int> ret(temp, temp + 2);
       if (nums.size() == 0)
           return ret;
       int l = 0;
       int r = nums.size();
       int mid = 0;
       while (l <= r){
           mid = (l + r) / 2;
           if (nums[mid] == target)
               break;
           else if (nums[mid]>target)
               r = mid - 1;
           else
               l = mid + 1;
       }
       if (nums[mid] != target){
           return ret;
       }
       l = r = mid;
       while (nums[l] == target&&l>0)
           l--;
       while (r<nums.size() && nums[r] == target)
           r++;
       if (nums[l] != target)
           l++;
       if (r>=nums.size()||nums[r] != target)//注意r可能为nums.size(),这种情况也要r--
           r--;
       ret[0] = l;
       ret[1] = r;
       return ret;
    }
};

 

思路2:类似于lower_bound和upper_bound的实现
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        int a[]={findLow(nums,target),findHigh(nums,target)};
        vector<int> ret(a,a+2);
        return ret;
    }
    int findLow(vector<int>& nums,int target){
        int l=0,r=nums.size()-1;
        while(l<=r){
            int m=(l+r)>>1;
            if(nums[m]<target)
                l=m+1;
            else
                r=m-1;
        }
        if(nums[l]==target)
            return l;
        return -1;
    }
    int findHigh(vector<int>& nums,int target){
        int l=0,r=nums.size()-1;
        while(l<=r){
            int m=(l+r)>>1;
            if(nums[m]>target)
                r=m-1;
            else
                l=m+1;
        }
        if(nums[r]==target)
            return r;
        return -1;
    }
    
};

 

 
 
 

 

转载于:https://www.cnblogs.com/zhoudayang/p/5039456.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值