文章目录
更多LeetCode题解
Given an array of integers nums
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 ( l o g n ) O(log n) O(logn).
If the target is not found in the array, return [-1, -1]
.
Example 1:
Input: nums = [5,7,7,8,8,10], target = 8
Output: [3,4]
Example 2:
Input: nums = [5,7,7,8,8,10], target = 6
Output: [-1,-1]
Solution
二分查找的变体,使用两次二分查找,一次查找最左边的索引,一次查找最右边的索引。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> targetRange = { -1, -1 };
int lo = findIndexOfTarget(nums, target, true);
if (lo==nums.size() || nums[lo] != target) {
return targetRange;
}
int hi = findIndexOfTarget(nums, target, false) - 1;
targetRange[0] = lo;
targetRange[1] = hi;
return targetRange;
}
int findIndexOfTarget(vector<int>& nums, int target, bool left) {
int lo = 0, hi = nums.size();
while (lo < hi) {
int mi = (lo + hi) / 2;
if (target < nums[mi] || (left&&target == nums[mi])) {
hi = mi;
}
else {
lo = mi + 1;
}
}
return lo;
}
};