您的位置:首页 > 其它

LeetCode | Search for a Range

2014-08-10 11:59 295 查看
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]
.

题目解析:

这道题目很典型,在二分查找的基础上,将等于target的判断归并到一边,会得到上界或者下届。那么我们需要写查找上下界的函数,又因为代码类似,就用一个bool值,来代表要找上届还是下届,归并成一个函数。

#include <iostream>
#include <vector>
using namespace std;

class Solution {
public:
int FindPos(int A[],int lo,int hi,int target,bool fleft){
if(hi < lo)
return -1;
if(fleft == true){
while(lo <= hi){
int mid = (lo + hi)/2;
if(A[mid]<target)   //通过分析,二分查找,利用一半相等一半不相等,来确定上下界!
lo = mid+1;
else
hi = mid-1;
}
return hi+1;    //要留意返回值
}
while(lo <= hi){
int mid = (lo + hi)/2;
if(A[mid] <= target)
lo = mid + 1;
else
hi = mid - 1;
}
return lo-1;
}

vector<int> searchRange(int A[], int n, int target) {
vector<int> ans;
int left = FindPos(A,0,n-1,target,true);
int right = FindPos(A,0,n-1,target,false);

if(right < left){   //通过这句来判断是否存在target值,不存在就重新赋值成-1
left = -1;
right = -1;
}
ans.push_back(left);
ans.push_back(right);

return ans;
}
};

int main()
{
int arr[] = {5,7,7,8,8,9};
int n = sizeof(arr)/sizeof(int);
int target;

Solution tp;
while(cin >> target){
vector<int> vec;
vec = tp.searchRange(arr,n,target);

cout << "["<<vec[0] << "," << vec[1] << "]" << endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: