【模板题】二分法 - 34. 在排序数组中查找元素的第一个和最后一个位置
题目链接 | 34. 在排序数组中查找元素的第一个和最后一个位置 |
---|---|
思路 | 二分法 |
题解链接 | 【视频讲解】二分查找总是写不对?三种写法,一个视频讲透!(Python/Java/C++/C/Go/JS) |
关键点 | 模板题;应当熟练掌握 |
时间复杂度 | |
空间复杂度 |
代码实现:
# 闭区间 def lower_bound(nums, target): left, right = 0, len(nums) - 1 while left <= right: # 循环不变量: # nums[left-1] < target # nums[right+1] >= target mid = (left + right) // 2 if nums[mid] < target: left = mid + 1 else: right = mid - 1 return left # 左闭右开区间 def lower_bound2(nums, target): left, right = 0, len(nums) while left < right: mid = (left + right) // 2 # 循环不变量: # nums[left] < target # nums[right] >= target if nums[mid] < target: left = mid + 1 else: right = mid return left # 开区间 def lower_bound3(nums, target): left, right = -1, len(nums) while left + 1 < right: mid = (left + right) // 2 # 循环不变量: # nums[left] < target # nums[right] >= target if nums[mid] < target: left = mid else: right = mid return right class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: start = lower_bound(nums, target) if start == len(nums) or nums[start] != target: return [-1, -1] end = lower_bound3(nums, target+1) - 1 return [start, end]
2024-09-12
重点是循环不变量:
class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: n = len(nums) # start position # nums[left] < target && nums[right] >= target left, right = -1, n while left + 1 < right: mid = (left+right) // 2 if nums[mid] < target: left = mid else: right = mid if right == n or nums[right] != target: return [-1, -1] start = right # end position # nums[left] <= target && nums[right] > target left, right = -1, n while left + 1 < right: mid = (left+right) // 2 if nums[mid] <= target: left = mid else: right = mid end = right - 1 return [start, end]
分类:
LeetCode
标签:
LeetCode-二分法
, LeetCode-模板题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效