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]
我的解:
Runtime: 12 ms, faster than 32.21% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.2 MB, less than 98.90% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
// 递归进行,二分查找
void binSearch(vector<int>& nums, int target, int begin, int end, int& index1, int& index2)
{
while (begin <= end)
{
int mid = begin + (end - begin) / 2;
if (nums[mid] == target)
{
if (mid < index1)index1 = mid;
if (mid > index2)index2 = mid;
if (begin == end) return ;
if (mid > 0 && nums[mid - 1] == target) binSearch(nums, target, begin, mid - 1, index1, index2);
if (mid < end && nums[mid + 1] == target) binSearch(nums, target, mid + 1, end, index1, index2);
return;
}
if (nums[mid] < target)
{
begin = mid + 1;
}
if (nums[mid] > target)
{
end = mid - 1;
}
}
}
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res{ -1,-1 };
if (nums.size() < 1)return res;
int b = 0;
int e = nums.size() - 1;
int index1 = e + 1;
int index2 = b - 1;
binSearch(nums, target, b, e, index1, index2);
if (index1 <= index2)
{
res[0] = index1;
res[1] = index2;
}
return res;
}
};
优秀解1:
Runtime: 8 ms, faster than 85.03% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
Memory Usage: 10.1 MB, less than 100.00% of C++ online submissions for Find First and Last Position of Element in Sorted Array.
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int idx1 = lower_bound(nums, target);
int idx2 = lower_bound(nums, target+1)-1;
if (idx1 < nums.size() && nums[idx1] == target)
return {idx1, idx2};
else
return {-1, -1};
}
// 利用二分查找的思想
int lower_bound(vector<int>& nums, int target) {
int l = 0, r = nums.size()-1;
while (l <= r) {
int mid = (r-l)/2+l;
if (nums[mid] < target)
l = mid+1;
else
r = mid-1;
}
return l;
}
};