leetcode力扣刷题打卡
题目:34. 在排序数组中查找元素的第一个和最后一个位置
描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
进阶:
你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
解题思路
1、既然都排好序了,那必须二分啊;
2、用二分找到第一个出现tartget的下标start,以及倒数第一个出现的target的下标end,返回{start, end};
3、注意特殊情况,数组为空以及target不存在的情况。
原代码##
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n = nums.size();
if (n == 0) return {-1, -1};
int l = 0, r = n - 1, start = 0, end = r;
while (l != r) {
int mid = (l + r) / 2;
if (nums[mid] >= target) r = mid;
else l = mid + 1;
}
start = l;
if (nums[start] != target) return {-1, -1};
l = start, r = n - 1;
while (l != r) {
int mid = (l + r + 1) / 2;
if (nums[mid] <= target) l = mid;
else r = mid - 1;
}
end = l;
return {start, end};
}
};