Leetcode_34. Search for a Range

来源:互联网 发布:php出生以来的时间戳 编辑:程序博客网 时间:2024/06/02 05:35

最近在做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;           }};