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);
}
}
};