llllmz

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

34. 在排序数组中查找元素的第一个和最后一个位置

这题还蛮有意思的,看了下解析,分成两部分分开来求解。

左右边界都是普通的二分查找算法,重点就是当等于的时候的处理,左边界函数等于目标值的时候,要记录当前mid的值作为边界,同时区间要向左移。

反过来,右边界的话,区间要向右移动。记得记录相等时候的mid值,最后一次相等记录的值也就是这个边界值。

class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
return {getLeftBorder(nums, target), getRightBorder(nums, target)};
}
private:
int getRightBorder(const vector<int>& nums, int target){
int head = 0, tail = nums.size() - 1;
int rightBorder = -1;
while(head <= tail){
int mid = head + (tail - head) / 2;
if(nums[mid] < target){
head = mid + 1;
}else if(nums[mid] > target){
tail = mid - 1;
}else{
rightBorder = mid;
head = mid + 1;
}
}
return rightBorder;
}
int getLeftBorder(const vector<int>& nums, int target){
int head = 0, tail = nums.size() - 1;
int leftBorder = -1;
while(head <= tail){
int mid = head + (tail - head) / 2;
if(nums[mid] == target){
leftBorder = mid;
tail = mid - 1;
}else if(nums[mid] > target){
tail = mid -1;
}else{
head = mid + 1;
}
}
return leftBorder;
}
};

posted on   神奇的萝卜丝  阅读(7)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示