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

Python每日一练---第三天:删除有序数组中的重复项

前言📢📢

Python每日一练来啦,本文已收录于:《Python每日一练》专栏

此专栏目的在于,帮忙学习Python的小白提高编程能力,训练逻辑思维,持续更新中,欢迎免费订阅!!!

  • 1. 问题描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3] 解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3] 输出:7, nums = [0,0,1,1,2,3,3] 解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

  • 2. 问题分析

使用滑动窗口+删除元素的方法。

对于nums = [1,1,1,2,2,3]

(1)窗口[1,1,1], 长度=3>2,删除第3个1---->[1,1,2,2,3]

(2)窗口[2,2],长度=2<=2,保留

(3)窗口[3],长度=1<=2,保留

结果:[1,1,2,2,3], 长度=5

  • 3. 算法思路

思路:

(1)定义窗口: beginIndex和endIndex标记相同元素的起始和结束位置

(2)遍历数组:用endIndex向右扩展,找到相同元素的连续区间

(3)处理重复:当遇到不同元素时,检查当前连续区间的长度

如果长度>2,删除多余的元素

如果长度<=2,直接移动指针

  • 4. 代码实现

from typing import Listclass Solution:def remove(self, nums: List[int]) -> int:if len(nums) <= 2:return len(nums)slow = 2  # 从第三个位置开始检查for fast in range(2, len(nums)):# 如果当前元素不等于slow指针前两个位置的元素# 说明可以保留当前元素if nums[fast] != nums[slow - 2]:nums[slow] = nums[fast]slow += 1return slowdef removeDuplicates(self, nums: List[int]) -> int:if not nums:return 0beginIndex = 0endIndex = 0value = nums[beginIndex]while endIndex < len(nums):if nums[endIndex] == value:endIndex += 1else:if endIndex - beginIndex > 2:for i in range(endIndex-1, beginIndex+1, -1):nums.pop(i)beginIndex = beginIndex + 2endIndex = beginIndexvalue = nums[beginIndex]else:beginIndex = endIndexvalue = nums[beginIndex]if endIndex - beginIndex > 2:for i in range(endIndex-1, beginIndex+1, -1):nums.pop(i)return len(nums)if __name__ == '__main__':#print(Solution().removeDuplicates([1,1,1]))#print(Solution().removeDuplicates([1,1,1,2,2,3]))print(Solution().removeDuplicates([0,0,1,1,1,1,2,3,3]))

这个算法的代码思路直观,容易理解,使用滑动窗口的概念,但是时间复杂度高,pop(i)操作是O(n),最坏情况时间复杂度是O(n^2),并且需要处理多个边界情况,频繁删除操作导致数组元素频繁移动。可以尝试使用双指针法,时间复杂度降为O(n).

http://www.dtcms.com/a/564654.html

相关文章:

  • U-Net 的输入与输出:通用场景与扩散模型场景解析
  • 李宏毅机器学习笔记39
  • 【代码随想录算法训练营——Day57(Day56周日休息)】图论——53.寻宝
  • PPT+配音生成带旁白的PPT演示视频
  • abp vnext cli无法正常使用,卡在 Checking extensions..,cli修改abp版本及.net版本
  • 萤石摄像头使用NAS作为存储
  • 2025江西省职业院校技能大赛(中职组)移动应用与开发竞赛样题
  • 建站公司哪家好在哪里推广比较好
  • 在 iOS 18 的照片应用,如何批量隐藏截屏?
  • OK3568 Android11 实现 App 独占隔离 CPU 核心完整指
  • 湖南网站建设公司 都来磐石网络泰安营销型网站建设公司
  • Oracle 如何计算 AWR 报告中的 Sessions 数量
  • JavaScript 流程控制语句
  • 走向专精:我的NLP特化算子开发之旅
  • 如何写prompt?prompt收集
  • 打工人日报#20251103
  • 技术文章大纲:设备如何“开口说话”?
  • CH585 高速 USB模拟 CDC串口应用示例
  • 2024/07 JLPT听力原文 问题四
  • 【AAOS】【源码分析】Car Location服务(二)- NMEA 数据
  • 如何建立国外网站搜索引擎优化岗位
  • 怎么建立网站网址在线做网站需要什么
  • https 可以访问 8866端口吗
  • python excel转为jsonl 格式 和 jsonl格式转为excel
  • docker中使用SSL证书实现前后端Https
  • IDE/编码代理架构与 Cursor 相关研究(汇总)
  • Multi-Stride Predictive RNG:革命性的可控随机数生成算法
  • Let’s Encrypt 证书申请与多服务器 HTTPS 配置指南
  • 艺术名画网站怎么建设多姿wordpress
  • R 绘图 - 散点图