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]
.
法一:
类似使用二分法,分别找出target的起始和终点
https://leetcode.com/problems/search-for-a-range/discuss/
class Solution { public: vector<int> searchRange(vector<int>& nums, int target) { vector<int> ind(2, -1); if(nums.capacity() == 0) return ind; int l = 0, r = nums.capacity() - 1; while(r > l){ //寻找左边缘 int m = (r + l)/2; if(nums[m] < target) l = m + 1; else r = m; } if(nums[l] != target) return ind; ind[0] = l; r = nums.capacity() - 1; while(r > l){ //寻找右边缘 int m = (r + l)/2 + 1; //加一使m更接近右边缘 if(nums[m] > target) r = m - 1; else l = m; } ind[1] = r; return ind; } };
法二:
使用函数库:
vector<int> searchRange(vector<int>& nums, int target) { auto bounds = equal_range(nums.begin(), nums.end(), target); if (bounds.first == bounds.second) return {-1, -1}; return {bounds.first - nums.begin(), bounds.second - nums.begin() - 1}; }