Leetcode——34 在排序数组中查找元素的第一个和最后一个位置
题目描述
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
题解
题目相对于Leetcode35的改变为序列可能有多个相同的数,求出数的两端。
还可以用类似于Leetcode35的办法求解,这一块可能比较难想,什么时候是求最左边什么时候是求最右边呢?
求左边:
while(l < r) {
int mid = l + r >> 1;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
可以这么理解,把程序执行过程看作人的行为逻辑。其实求左端和右端只是看数相等的时候会怎么操作,如果nums[mid]==target,在这种情况下,我也优先往左走,但当前的mid也是我的答案区间,这样就求出了最左端。
同样,求右端也一样:
while(l < r) {
int mid = l + r + 1 >> 1;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
尤其需要注意的是,如果数组nums为空的话,需要特判!
代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if(nums.size() == 0) return vector<int> {-1,-1};
int l = 0;
int r = nums.size() - 1;
int posl = -1;
int posr = -1;
while(l < r) {
int mid = l + r >> 1;
if(nums[mid] >= target) r = mid;
else l = mid + 1;
}
if(nums[l] == target)
posl = l;
l = 0;
r = nums.size() - 1;
while(l < r) {
int mid = l + r + 1 >> 1;
if(nums[mid] <= target) l = mid;
else r = mid - 1;
}
if(nums[l] == target)
posr = l;
return vector <int> {posl,posr};
}
};

184

被折叠的 条评论
为什么被折叠?



