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

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)

http://www.xdnf.cn/news/5047.html

相关文章:

  • Kafka单机版安装部署
  • 什么是信号完整性?
  • VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件
  • Tomcat的`context.xml`配置详解!
  • 嵌入式系统架构验证工具:AADL Inspector v1.10 全新升级
  • 1、mongodb-- BSON 学习和JSON性能对比
  • 新一代电动门“攻克”行业痛点,远峰科技打造“智能出入”新标杆
  • ApplicationEventPublisher 深度解析:Spring 事件驱动模型的核心
  • 图像来源:基于协同推理的双视角超声造影分类隐式数据增强方法|文献速递-深度学习医疗AI最新文献
  • 软件系统中功能模型 vs 数据模型 对比解析
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】电商数据分析案例-9.3 商品销售预测模型
  • C++线程库
  • ggplot2 | GO barplot with gene list
  • 深入探索DSPy:开启模块化AI编程的新篇章
  • Unity 日志存档功能
  • 数字化转型:概念性名词浅谈(第二十六讲)
  • c++ 命名空间
  • java的输入输出模板(ACM模式)
  • 软件测试——用例篇(2)
  • JavaScript与TypeScript深度对比分析
  • C++中volatile关键字详解
  • 赤色世界 陈默传 第一章 另一个陈默
  • 课程设计。。。。
  • 【C++设计模式之Strategy策略模式】
  • ISP流程介绍(Rgb格式阶段)
  • Java 原生实现代码沙箱(OJ判题系统第1期)——设计思路、实现步骤、代码实现
  • MySQL——七、索引
  • ArrayList和LinkedList区别
  • nginx的学习笔记
  • Android屏蔽通话功能和短信功能