代码随想录Day1 | LeetCode 704. 二分查找、LeetCode 27. 移除元素、LeetCode 977. 有序数组的平方
LeetCode 704. 二分查找
核心:明白[left, right] 和 [left, right)两种循环不变量
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1 # [left, right]
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid - 1
else:
return mid
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) # [left, right)
while left < right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
elif nums[mid] > target:
right = mid
else:
return mid
return -1
有关二分法其他经典题目:
LeetCode 35. 搜索插入位置
这道题实际上就是查找target的最左侧位置,如果没有就是第一个大于target的位置
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid
return left
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
这一题就是“二分查找”集大成者
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def _left():
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
if left == len(nums):
return -1
if nums[left] != target:
return -1
return left
def _right():
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] > target:
right = mid - 1
else:
left = mid + 1
if right == -1:
return -1
if nums[right] != target:
return -1
return right
return [_left(), _right()]
LeetCode 33. 搜索旋转排序数组
有关“二分查找”的主要变式
要注意if nums[mid] >= nums[left]中的“=”需要算在左崖上
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] == target:
return mid
if nums[mid] >= nums[left]:
if nums[mid] > target and target >= nums[left]:
right = mid -1
else:
left = mid + 1
else:
if nums[mid] < target and target <= nums[right]:
left = mid + 1
else:
right = mid - 1
return -1
LeetCode 74. 搜索二维矩阵
LeetCode 153. 寻找旋转排序数组中的最小值
LeetCode 4. 寻找两个正序数组的中位数
LeetCode 27. 移除元素
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow, fast = 0, 0
while fast < len(nums):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
977. 有序数组的平方
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left, right = 0, len(nums) - 1
res = [None] * len(nums)
p = len(nums) - 1
while left <= right:
if abs(nums[left]) < abs(nums[right]):
res[p] = nums[right] ** 2
right -= 1
else:
res[p] = nums[left] ** 2
left += 1
p -= 1
return res
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本