代码随想录算法训练营第一天(python) | 704. 二分查找、27. 移除元素。
题目链接:704 二分查找
关键点思路:
1、是否要进入到 while 部分的代码是 left <= right 还是 left < right, 看 [left, right] 是否是合法区间. 例如 [1, 1] 是合法区间,取<=; [1, 1) 非合法区间,取 < 。
2、缩小区间时,考虑边界是否已经比较过。
左闭右闭区间 [left, right]
class Solution:
def search(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums) - 1
while l <= r: # 左闭右闭区间
mid = (l+r) // 2
if target < nums[mid]: # mid 已经比较过,所以缩小区间取 mid - 1
r = mid - 1
elif target > nums[mid]: # mid 已经比较过,所以缩小区间取 mid + 1
l = mid + 1
else:
return mid
return -1
左闭右开区间 [left, right)
class Solution:
def search(self, nums: List[int], target: int) -> int:
l = 0
r = len(nums) # 左闭右开,避免错过最右端的元素
while l < r: # 采用左闭右开原则 [l, r)
mid = (l+r) // 2
if target < nums[mid]:
r = mid # 缩小区间,右边为开区间
elif target > nums[mid]:
l = mid + 1 # 缩小区间,左边为闭区间,去除已比较过的 mid
else:
return mid
return -1
时间复杂度为o(logn)
题目链接:27 移动元素
暴力法
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
i, l = 0, n
while i < l:
if nums[i] == val:
for j in range(i+1, l):
nums[j-1] = nums[j]
i -= 1
l -= 1
i += 1
return l
时间复杂度为 o(n**2)
双指针
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
n = len(nums)
slow, fast = 0, 0 # 定义 slow 慢指针指向不是 val 元素的位置, fast 指向不是 val 的元素
for i in range(n):
if nums[i] != val: # 将 fast 指向不为 val 的元素赋值给 slow 指向的位置
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
时间复杂度为 o(n)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~