leetcode

来源:互联网 发布:sql server access 编辑:程序博客网 时间:2024/05/22 01:40

Question34–Search for a Range

给定一个按升序排列的可以有重复元素的数组,同时给出一个目标元素target,返回target在数组中的开始下标和结束下标。若不在数组中,返回[-1,-1]. eg:[1,2,2,4,5,5,7]和5,则返回[4,5]。

算法

  1. 使用二分法,缩小区间,直到中间位置为target。
  2. 分别在找到target的那个区间的左、右区间进行二分查找,确定target的开始位置和结束位置。

Code

 vector<int> searchRange(vector<int>& nums, int target) {        int i=0, j=nums.size()-1;        int start=-1, end=-1;        while(i<=j){            int mid=(i+j)/2;            if(target<nums[mid]) j=mid-1;            else if(target>nums[mid]) i=mid+1;            else{                int p,q;                p=i;                q=mid;                while(p<q){                    int leftmid=(p+q)/2;                    if(nums[leftmid]==target) q=leftmid;                    if(nums[leftmid]<target) p=leftmid+1;                }                start=q;                p=mid;                q=j;                while(p<q){                    int rightmid=(p+q+1)/2;                    if(nums[rightmid]==target) p=rightmid;                    if(nums[rightmid]>target) q=rightmid-1;                }                end=p;                break;            }        }        vector<int> range{start,end};        return range;    }
原创粉丝点击