范围查找

Search for a Range


这里写图片描述


线性算法

这里写图片描述

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

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值