题目源自于leetcode。二分查找题。
题目: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]
.
思路:有序数组,所以查找目标的数一定是连续的在某个范围上。我们是要通过二分查找找到这些相同的数的最左端的一个、和最右端的一个。不管是左端还是右端,指定合理的二分策略,一定都是可以找到的。
寻找目标数最左端的二分策略:
//Find left
high = n-1;
low = 0;
mid = (high+low)/2;//如果分段内有奇数个数,mid位于正中间;如果有偶数个数,mid位于左中间
while(high > low)
{
if(A[mid] >= target) //找到目标数时优先向左二分
high = mid;
else
low = mid + 1;
mid = (high+low)/2;
}
寻找目标数最右端的二分策略:
//Find right
high = n-1;
low = 0;
mid = (high+low+1)/2; //如果分段内有奇数个数,mid位于正中间;如果有偶数个数,mid位于右中间
while(high > low)
{
if(A[mid] > target)
high = mid -1;
else //找到目标数时优先向右二分
low = mid;
mid = (high+low+1)/2;
}
代码:
class Solution {
public:
vector<int> searchRange(int A[], int n, int target) {
vector<int> result;
int high, low, mid;
//Find left
high = n-1;
low = 0;
mid = (high+low)/2;
while(high > low)
{
if(A[mid] >= target)
high = mid;
else
low = mid + 1;
mid = (high+low)/2;
}
if(A[mid] != target)
{
result.push_back(-1);
result.push_back(-1);
return result;
}
result.push_back(mid);
//Find right
high = n-1;
low = 0;
mid = (high+low+1)/2;
while(high > low)
{
if(A[mid] > target)
high = mid -1;
else
low = mid;
mid = (high+low+1)/2;
}
result.push_back(mid);
return result;
}
};