(算法)二分查找的搜索区间

题目:

给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。

如果目标值不在数组中,则返回[-1, -1]

思路:

1、直接遍历数组,复杂度O(n)

2、二分查找

先通过二分查找,找到target出现的最左边的位置,如果不存在,返回-1;

再通过二分查找,找到target出现的最右边的位置,如果不存在,返回-1;

代码:

#include<iostream>
#include<vector>

using namespace std;

int searchLeft(const vector<int> &A,int left,int right,int target){
    int first=left;
    int last=right;
    int mid=-1;
    while(first<=last){
        mid=first+((last-first)>>1);
        if(A[mid]==target){
            if(mid>left && A[mid-1]==target)
                last=mid-1;
            else
                return mid;
        }
        else if(A[mid]<target)
            first=mid+1;
        else
            last=mid-1;
    }
    return mid;
}

int searchRight(const vector<int> &A,int left,int right,int target){
    int first=left;
    int last=right;
    int mid=-1;
    while(first<=last){
        mid=first+((last-first)>>1);
        if(A[mid]==target){
            if(mid<right && A[mid+1]==target)
                first=mid+1;
            else
                return mid;
        }
        else if(A[mid]<target)
            first=mid+1;
        else
            last=mid-1;
    }
    return mid;
}

void searchRange(const vector<int> &A,int left,int right,int target,int &start,int &end){
    start=searchLeft(A,left,right,target);
    end=searchRight(A,left,right,target);
}

int main(){
    int n;
    int start=-1;
    int end=-1;
    int target;

    while(cin>>n){
        vector<int> num(n);
        for(int i=0;i<n;i++)
            cin>>num[i];
        cin>>target;
        searchRange(num,0,n-1,target,start,end);
        cout<<start<<" "<<end<<endl;
    }
    return 0;
}

 

posted @ 2015-09-21 22:04  AndyJee  阅读(1810)  评论(0编辑  收藏  举报