题目来源:https://leetcode.com/problems/search-for-a-range/ 点击打开链接
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(log n)的时间,
所以我们采用两次二分查找。 首先二分找到第一个该值出现的位置, 譬如m, 然后在[m, n)区间内第二次二
分找到最后一个该值出现的位置。
class Solution34{
public:
vector<int> searchRange(vector<int>& nums, int target){
if (nums.size() == 0){
return vector<int>({ -1, -1 });
}
vector<int> vec;
int left = 0;
int right = nums.size() - 1;
//第一次二分查找第一个位置
while (left <= right){
int mid = (left + right) / 2;
if (target <= nums[mid]){
right = mid - 1;
}
else{
left = mid + 1;
}
}
if (left < nums.size() && nums[left] == target){
vec.push_back(left);
}
else{
return vector<int>({ -1, -1 });
}
left = left;
right = nums.size() - 1;
while (left <= right){
int mid = (left + right) / 2;
if (target >= nums[mid]){
left = mid + 1;
}
else{
right = mid - 1;
}
}
vec.push_back(right);
return vec;
}
};
int main()
{
Solution34 solution;
{
vector<int> nums = { 5, 7, 8, 8, 8, 10 };
int target = 8;
vector<int> vec;
vec = solution.searchRange(nums, target);
vector<int>::iterator iter;
for (iter = vec.begin();iter != vec.end(); ++iter){
cout << *iter <<" ";
}
}
system("pause");
return 0;
}