题目:
Given an array of integers sorted in ascending order, 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].
链接:Search for a Range
解法:两次二分查找寻找数字的两个边界。时间O(logn)
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> ans;
int l = 0, r = nums.size() - 1;
if (r < 0) {
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
if (target < nums[l] || target > nums[r]) {
ans.push_back(-1);
ans.push_back(-1);
return ans;
}
while (l < r) {
int m = (l + r) / 2;
if (nums[m] < target && nums[m + 1] >= target) {
r = m + 1;
break;
}
else if (nums[m] < target) l = m;
else r = m;
}
ans.push_back(r);
l = 0, r = nums.size() - 1;
while (l < r) {
int m = (l + r) / 2;
if (nums[m] <= target && (nums[m + 1] > target || m == nums.size() - 1)) {
l = m;
break;
}
else if (nums[m] <= target) l = m + 1;
else r = m;
}
ans.push_back(l);
if (ans[0] > ans[1]) ans[0] = ans[1] = -1;
return ans;
}
};
Runtime: 9 ms