34. Search for a Range

来源:互联网 发布:东非解放军 知乎 编辑:程序博客网 时间:2024/03/29 14:19

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].

这道题要算法复杂度是O(log N),第一时间想到的就是二分法。
第一种方法:貌似不是二分法,但是也蛮快的。

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target)     {        vector<int>temp;        int l=0,r=nums.size()-1;        while(l<=r)        {            if(nums[l]==nums[r]&&nums[l]==target)            {                temp.push_back(l);                temp.push_back(r);                return temp;            }            f(target<nums[r])                r--;            else if(target>nums[l])                l++;        }        temp.push_back(-1);        temp.push_back(-1);        return temp;    }};

第二种方法:左右反复调用二分法,这样反而速度比较慢

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target)     {        vector<int>temp;        int l=0,r=nums.size()-1;        int left=-1;        while(Binsearch(nums,target,l,r)!=-1)        {            left=Binsearch(nums,target,l,r);            r=left-1;        }        temp.push_back(left);        l=0,r=nums.size()-1;        int right=-1;        while(Binsearch(nums,target,l,r)!=-1)        {            right=Binsearch(nums,target,l,r);            l=right+1;        }        temp.push_back(right);        return temp;    }    int Binsearch(vector<int>& nums,int target,int left,int right)    {         int mid;        while(left<=right)        {            mid=(left+right)/2;            if(nums[mid]==target)                return mid;            else if(target>nums[mid])                left=mid+1;            else                right=mid-1;        }        return -1;    }};

第三种方法只进行一次二分调用找到target中心,再向两边扩散

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target)     {        vector<int>temp;        int l=0,r=nums.size()-1;        int index=Binsearch(nums,target,l,r);        if(index==-1)        {            temp.push_back(-1);            temp.push_back(-1);        }        else        {            int left=index;            while(left>0&&nums[left-1]==target)                left--;            int right=index;            while(right<nums.size()-1&&nums[right+1]==target)                right++;            temp.push_back(left);            temp.push_back(right);        }        return temp;    }    int Binsearch(vector<int>& nums,int target,int left,int right)    {         int mid;        while(left<=right)        {            mid=(left+right)/2;            if(nums[mid]==target)                return mid;            else if(target>nums[mid])                left=mid+1;            else                right=mid-1;        }        return -1;    }};
0 0
原创粉丝点击