当前位置: 首页 > news >正文

LeetCode百题刷001双指针·快慢指针

遇到的问题都有解决的方案,希望我的博客可以为你提供一些帮助

图片源自leetcode 

题目:80. 删除有序数组中的重复项 II - 力扣(LeetCode)

这一题是经典的双指针问题,题目要求在给定数组上原地修改且空间复杂度需要为O(1)

一、算法思路

核心思想:利用 双指针 技术,通过一个快指针i扫描数组,一个慢指针k标记有效部分的末尾+1的元素位置由于数组下标从0开始返回的k值就是有效元素的个数。

关键观察

  • 由于数组已排序,重复元素必然连续出现。
  • 只需确保 每个元素最多保留两次,即当发现一个新元素时,直接保留;若当前元素与慢指针前两个位置的元素相同,说明已经保留过两次(因为所给的数组是有序的,且相同的元素最多可保留2个,每次的k-2所指向的其实是上一个保留的元素),跳过它。

二、详细步骤

边界处理

  • 如果数组长度 ≤ 2,直接返回原长度(无需处理)。

初始化指针

  • 慢指针 k = 2,因为前两个元素无论是否重复,都可以直接保留。

遍历数组

  • 快指针 i 从索引 2 开始遍历整个数组。
  • 对每个元素 nums[i],检查它是否与 nums[k-2] 相同

如果不同:说明 nums[i] 可以保留,将其复制到 nums[k],然后 k += 1

如果相同:说明已经保留过两次,跳过当前元素。

终止条件:遍历完成后,k 即为新数组的长度。

class Solution:def removeDuplicates(self, nums: list[int]) -> int:if len(nums)<=2:return len(nums)else:k=2for i in range (2,len(nums)):if nums[i]==nums[k-2]:#该元素保留过两次,不保留continueelse :#新元素,保留nums[k]=nums[i]k+=1return k

结果:

三、复杂度分析 

主要耗时在for循环,快指针遍历数组一次,最坏情况下需要“保留”n-2次,时间复杂度O(n)

相关文章:

  • Kaggle图像分类竞赛实战总结详细代码解读
  • 图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法|文献速递-深度学习医疗AI最新文献
  • 插槽、生命周期
  • RabbitMQ消息的重复消费问题如何解决?
  • 港大今年开源了哪些SLAM算法?
  • Cluster Interconnect in Oracle RAC
  • 一些模型测试中的BUG和可能解决方法
  • PostgreSQL逻辑复制(logic replication)
  • [AI ][Dify] Dify Tool 插件调试流程详解
  • 浅聊大模型-有条件的文本生成
  • 具身智能时代的机器人导航和操作仿真器综述
  • MySQL数据库故障排查与解决方案
  • 窗口函数row_number() OVER()对每个组内的行按照特定条件进行编号
  • 免布线视频桩:智慧城市停车降本增效的破局利器
  • 《循序渐进linux》
  • AWS IoT Core与MSK集成实战:打造高可靠实时IoT数据管道
  • 【C++设计模式之Strategy策略模式】
  • 学习心得《How Global AI Policy and Regulations Will Impact Your Enterprise》Gartner
  • 文本框碰撞测试
  • C++AVL树
  • AI药企英矽智能第三次递表港交所:去年亏损超1700万美元,收入多数来自对外授权
  • 中科院院士魏辅文已卸任江西农业大学校长
  • 重磅金融政策密集发布!一文梳理这场国新办发布会
  • 中国电信财务部总经理周响华调任华润集团总会计师
  • 牛市早报|金融政策支持稳市场稳预期发布会将举行,商务部:中方决定同意与美方进行接触
  • 住宿行业迎“最火五一”:数千家酒店连续3天满房,民宿预订量创历史新高