问题描述:
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),可以采用二分查找。
1) 使用STL中low_bound()和upper_bound()直接找到边界。
2) 采用分治法,如解法一所示
问题求解一:
Divide and Conquer
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
return search(nums, 0, n - 1, target);
}
private:
vector<int> search(vector<int>& nums, int i, int r, int target) {
if (nums[i] == target && nums[r] == target) return {i, r};
if (nums[i] <= target && target <= nums[r]) {
int mid = i + ((r - i) >> 1);
vector<int> left = search(nums, i, mid, target);
vector<int> right = search(nums, mid +1, r, target);
if (left[0] == -1) return right;
if (right[0] == -1) return left;
return {left[0], right[1]};
}
return {-1, -1};
}
};
使用标准库
class Solution {
public:
vector<int> searchRange(int A[], int n, int target) {
int* lower = lower_bound(A, A + n, target);
int* upper = upper_bound(A, A + n, target);
if (*lower != target)
return vector<int> {-1, -1};
else
return vector<int>{lower - A, upper - A - 1};
}
};