LeetCode-34. Search for a Range
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(log n).
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]
解题思路:可以用两次二分查找分别找出上限和下限
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int mid;
vector<int> ret(2, -1);
if(nums.size()==0)return ret;
int lh = 0, rh = nums.size() - 1;
while (lh < rh)
{
mid = (lh + rh) / 2;
if (nums[mid] < target) lh = mid + 1;
else rh = mid;
}
if (nums[lh] != target)
return ret;
else
ret[0] = lh;
rh = nums.size() - 1;
while (lh < rh)
{
mid = (lh + rh+1) / 2;
if (nums[mid] > target) rh = mid - 1;
else lh = mid;
}
ret[1] = rh;
return ret;
}
};
也可以利用STL自带的函数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};
}
equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[first,last)之中符合此一性质的最大子区间。
vector<int> searchRange(vector<int>& nums, int target) {
int lo = lower_bound(nums.begin(), nums.end(), target) - nums.begin();
if (lo == nums.size() || nums[lo] != target)
return {-1, -1};
int hi = upper_bound(nums.begin(), nums.end(), target) - nums.begin() - 1;
return {lo, hi};
}