问题:
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]
.
明显是要用binary search。我的方法是,先找下界,再找上界,用两个不同的函数。
代码:
class Solution {
public:
int searchLower(int A[], int start, int end, int target) {
if (start > end)
return -1;
if (start == end) {
if (A[start] != target)
return -1;
return start;
}
int mid = start + (end - start) / 2;
if (mid == 0) {
if (A[0] == target)
return 0;
if (A[0] > target)
return -1;
if (A[0] < target)
return searchLower(A, mid + 1, end, target);
}
if (A[mid] == target && A[mid - 1] < target) return mid;
if (A[mid] < target) return searchLower(A, mid + 1, end, target);
if (A[mid] >= target) return searchLower(A, start, mid - 1, target);
}
int searchUpper(int A[], int n, int start, int end, int target) {
if (start > end)
return -1;
if (start == end) {
if (A[start] == target)
return start;
return -1;
}
int mid = start + (end - start) / 2;
if (mid == n-1) return searchUpper(A, n, mid, mid, target);
if (A[mid] == target && A[mid + 1] > target) return mid;
if (A[mid] <= target) return searchUpper(A, n, mid + 1, end, target);
if (A[mid] > target) return searchUpper(A, n, start, mid - 1, target);
}
vector<int> searchRange(int A[], int n, int target) {
vector<int> result (2, -1);
int l = searchLower(A, 0, n-1, target);
int u = searchUpper(A, n, 0, n-1, target);
result[0] = l;
result[1] = u;
return result;
}
};