您的位置:首页 > 其它

[Leetcode]Search for a Range

2014-11-05 13:00 176 查看
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]
.

 这道题目的是让找到目标元素所在的范围,要求复杂度是O(lgn),因此不能使用线性的查找方法,这里用二叉查找法。

首先求mid元素,结果分为三种情况:

A[mid]>target:搜寻left~mid范围;

A[mid]<target:搜寻mid~right范围;

A[mid]==target:以mid为分界点,向左向右分别采用二叉查找法寻找目标元素的头和尾。、

如果没有找到目标元素,则返回[-1,-1].

算法实现如下:

class Solution {
public:
vector<int> searchRange(int A[], int n, int target) {
int left = 0, right = n - 1;
vector<int> result;
while (left <= right){
int mid = (left + right) >> 1;
if (A[mid] == target){
int head = searchHead(A,left,mid,target);
result.push_back(head);
int end = searchEnd(A,mid,right,target);
result.push_back(end);
return result;
}
else if(A[mid] < target){
left = mid + 1;
}
else{
right = mid - 1;
}
}
result.push_back(-1);
result.push_back(-1);
return result;
}
int searchHead(int A[], int left, int right, int target){ //寻找第一个目标元素的位置
if (left == right) return left;<span style="white-space:pre"> </span>
if (left == right - 1){<span style="white-space:pre"> </span>//只要上层函数mid右侧有大于2个元素,那递归的最后肯定只剩下2个元素
if (A[left] == target) return left;<span style="white-space:pre"> </span>//所以要判断这连个元素是不是target,不加这一步判断就会陷入死循环
else return right;
}
int mid = (left + right) >> 1;
if (A[mid] == target){
return searchHead(A, left, mid, target);
}
else{
return searchHead(A, mid, right, target);
}
}
int searchEnd(int A[], int left, int right, int target){ //寻找最后一个目标元素的位置
if (left == right) return left;
if (left == right-1){
if (A[right] == target) return right;
else return left;
}
int mid = (left + right) >> 1;
if (A[mid] == target){
return searchEnd(A, mid, right, target);
}
else{
return searchEnd(A, left, mid, target);
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode binary search