范围查找

来源:互联网 发布:福禄克网络测试 编辑:程序博客网 时间:2024/06/05 08:59

Search for a Range


  • 题目来源:
    leetcode 34

这里写图片描述


线性算法

这里写图片描述

利用第二种思路编写代码如下:

vector<int> searchRange(vector<int>& nums, int target) {    vector<int> ans;    if (nums.size()==0) {   //如果为空返回[-1,-1]        ans.push_back(-1);        ans.push_back(-1);        return ans;    }    else{        int start = 0;        int end = nums.size()-1;        int mid;        int pos=-1;        while (start<=end) {            mid = (start+end)/2;            if (nums[mid]==target) {                pos = mid;            //找到位置时则纪录位置为pos,并终止循环                break;            }            else if(nums[mid]>target){                end = mid-1;            }            else{                start = mid+1;            }        }        if (pos!=-1) {         //当找到了target位置时,分别向两边扩展查找            int i=pos;            while (nums[i]==target&&i>=0) {   //向左边界扩展;当找到nums[i]!=target或者到达左边界了,则停止                i--;            }            int j=pos;            while (nums[j]==target&&j<nums.size()) {  //向右边界扩展;当找到nums[i]!=target或者到达右边界了,则停止                j++;            }            ans.push_back(i+1);            ans.push_back(j-1);            return ans;        }        else{            ans.push_back(-1);            ans.push_back(-1);            return ans;        }    }}

log(n)的算法

这里写图片描述

int findStart(vector<int>& nums, int target){  //寻找左边界    if (nums.size()==0) {        return -1;    }    else{        int start = 0;        int end = nums.size()-1;        int mid;        while (start<=end) {            mid = (start+end)/2;            if(nums[mid]==target){                if (mid==0) {  //当mid为数组最左边时,则mid就是左边界                    return mid;                }                else if(nums[mid-1]!=target)   //当nums[mid-1]!=target,则说明mid是左边界(mid-1不越界的情况下)                    return mid;                else                    end=mid-1;            }            else if(nums[mid]<target){                start=mid+1;            }            else                end=mid-1;        }        return -1;    }}int findEnd(vector<int>& nums, int target){   //寻找右边界    if (nums.size()==0) {        return -1;    }    else{        int start = 0;        int end = nums.size()-1;        int mid;        while (start<=end) {            mid = (start+end)/2;            if(nums[mid]==target){                if (mid==nums.size()-1) {  //当mid为数组最右边时,则mid就是右边界                    return mid;                }                else if(nums[mid+1]!=target)  //当nums[mid+1]!=target,则说明mid是右边界(mid+1不越界的情况下)                    return mid;                else                    start=mid+1;            }            else if(nums[mid]<target){                start=mid+1;            }            else                end=mid-1;        }        return -1;    }}vector<int> searchRange(vector<int>& nums, int target) {    vector<int> ans;    if (nums.size()==0) {        ans.push_back(-1);        ans.push_back(-1);        return ans;    }    else{        //分别寻找左右边界        int start = findStart(nums, target);        int end = findEnd(nums, target);        ans.push_back(start);        ans.push_back(end);        return ans;    }}
0 0
原创粉丝点击