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. 代码实现

python 复制代码
from typing import List

class 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 += 1

        return slow

    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0
        beginIndex = 0
        endIndex = 0
        value = nums[beginIndex]
        while endIndex < len(nums):
            if nums[endIndex] == value:
                endIndex += 1
            else:
                if endIndex - beginIndex > 2:
                    for i in range(endIndex-1, beginIndex+1, -1):
                        nums.pop(i)
                    beginIndex = beginIndex + 2
                    endIndex = beginIndex
                    value = nums[beginIndex]
                else:
                    beginIndex = endIndex
                    value = 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).

相关推荐
AI、少年郎1 分钟前
如何用个人电脑快速训练自己的语言模型?MiniMind 全流程实战指南
人工智能·python·神经网络·ai·自然语言处理·大模型·模型训练微调
王家视频教程图书馆3 分钟前
rust 写gui 程序 最流行的是哪个
开发语言·后端·rust
枫叶林FYL4 分钟前
【Python高级工程与架构实战】项目四 现代ETL编排平台:Airflow + dbt + Snowflake 企业级数据管道架构与实现
人工智能·python·架构·etl
源码之屋5 分钟前
计算机毕业设计:Python天气数据采集与可视化分析平台 Django框架 线性回归 数据分析 大数据 机器学习 大模型 气象数据(建议收藏)✅
人工智能·python·深度学习·算法·django·线性回归·课程设计
Wadli6 分钟前
Oncall Agent项目
开发语言
艾莉丝努力练剑11 分钟前
【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
linux·运维·服务器·开发语言·网络·qt·架构
捧月华如11 分钟前
React vs Vue vs Angular:三大前端框架深度对比
python·github
AI_Claude_code12 分钟前
安全与合规核心:匿名化、日志策略与法律风险规避
网络·爬虫·python·tcp/ip·安全·http·网络爬虫
杜子不疼.13 分钟前
用 Python 实现 RAG:从文档加载到语义检索全流程
开发语言·人工智能·python