LeetCode 34. Search for a Range

来源:互联网 发布:localstorage存储数据 编辑:程序博客网 时间:2024/06/05 20:42

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].
题目链接
题意:查找一列有序数组中某个数字出现的位置区间。

代码一(9ms):使用STL lower_bound upper_bound函数。

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。
lower_bound和upper_bound如下图所示:
lower_bound  upper_bound

class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        vector<int> vec;        //ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。        //ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。        int low=lower_bound(nums.begin(),nums.end(),target)-nums.begin();        int high=upper_bound(nums.begin(),nums.end(),target)-nums.begin();        if(low==high){            vec.push_back(-1);            vec.push_back(-1);            return vec;        }        vec.push_back(low);        vec.push_back(high-1);        return vec;    }};
代码二 ( 12ms ):
class Solution {public:    vector<int> searchRange(vector<int>& nums, int target) {        vector<int> vec(2,-1);        //二分查找结束时,返回的位置一定是这个数开始的位置(如果存在的话)。        int low=0,high=nums.size()-1,mid=0;        while(low<high){            mid=(low+high)/2;            if(nums[mid]<target){                low=mid+1;            }            else                high=mid;        }        if(nums[low]!=target){            return vec;        }        vec[0]=low;        high=nums.size()-1;        while(low<high){            mid=(low+high+1)/2;            if(nums[mid]>target){                high=mid-1;            }            else                low=mid;        }        vec[1]=high;        return vec;    }};

代码二解释

0 0
原创粉丝点击