34. 在排序数组中查找元素的第一个和最后一个位置
1.34. 在排序数组中查找元素的第一个和最后一个位置
2.69. x 的平方根3.367. 有效的完全平方数4.27. 移除元素5.26. 删除有序数组中的重复项6.283. 移动零7.844. 比较含退格的字符串8.977. 有序数组的平方9.209. 长度最小的子数组10.904. 水果成篮11.76. 最小覆盖子串12.76. 最小覆盖子串13.59. 螺旋矩阵 II14.58. 区间和(第九期模拟笔试)15.44. 开发商购买土地16.20. 有效的括号17.146. LRU 缓存18.203. 移除链表元素19.707. 设计链表20.206. 反转链表21.24. 两两交换链表中的节点22.19. 删除链表的倒数第 N 个结点23.19. 删除链表的倒数第 N 个结点 Plus24.面试题 02.07. 链表相交25.142. 环形链表 II26.242. 有效的字母异位词27.349. 两个数组的交集28.202. 快乐数29.1. 两数之和30.454. 四数相加 II31.383. 赎金信32.15. 三数之和33.18. 四数之和34.344. 反转字符串35.541. 反转字符串 II36.55. 右旋字符串(第八期模拟笔试)37.28. 找出字符串中第一个匹配项的下标38.459. 重复的子字符串39.232. 用栈实现队列40.225. 用队列实现栈41.20. 有效的括号这题还蛮有意思的,看了下解析,分成两部分分开来求解。
左右边界都是普通的二分查找算法,重点就是当等于的时候的处理,左边界函数等于目标值的时候,要记录当前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; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?