LeetCode 26. Remove Duplicates from Sorted Array 题解

LeetCode 26. Remove Duplicates from Sorted Array 题解

题目描述

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

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

示例 1:

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

示例 2:

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

解题思路

方法:双指针

思路

  • 使用两个指针,一个慢指针 slow 指向当前已处理的无重复元素的末尾,一个快指针 fast 遍历整个数组
  • 初始时,slow 指向 0,fast 指向 1
  • 遍历数组:
    • 如果 nums[fast] 不等于 nums[slow],说明找到一个新的无重复元素
    • slow 右移一位,然后将 nums[fast] 赋值给 nums[slow]
    • 无论是否找到新元素,fast 都右移一位
  • 遍历结束后,slow + 1 就是删除重复元素后的数组长度

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组的长度。只需要遍历数组一次。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法:双指针

python 复制代码
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0
        
        # 慢指针指向当前已处理的无重复元素的末尾
        slow = 0
        # 快指针遍历整个数组
        for fast in range(1, n):
            # 如果找到一个新的无重复元素
            if nums[fast] != nums[slow]:
                # 将 slow 右移一位
                slow += 1
                # 将新元素赋值给 nums[slow]
                nums[slow] = nums[fast]
        
        # slow + 1 就是删除重复元素后的数组长度
        return slow + 1

测试用例

测试用例 1:

输入:nums = [1,1,2]

输出:2

测试用例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]

输出:5

测试用例 3:

输入:nums = []

输出:0

测试用例 4:

输入:nums = [1]

输出:1

总结

本题是双指针的经典应用问题,主要考察对双指针技巧的理解和使用。通过使用慢指针和快指针,我们可以在原地删除排序数组中的重复元素。

双指针的核心思想是:慢指针指向当前已处理的无重复元素的末尾,快指针遍历整个数组,当找到新的无重复元素时,将其移动到慢指针的位置,然后慢指针右移。

这种方法不仅适用于删除排序数组中的重复元素,还可以应用于许多其他需要原地修改数组的问题,例如移除元素、移动零等。掌握双指针的使用,对于解决这类问题非常重要。

相关推荐
数模竞赛Paid answer9 小时前
2026年中青杯数学建模A题数学建模论文智能评估系统与多智能体优化方法求解全过程论文及程序
算法·数学建模·中青杯
银-豆豆10 小时前
数据结构与算法-动态规划、回溯与贪心
算法·动态规划
想吃火锅100511 小时前
【leetcode】200. 岛屿数量
算法·leetcode·职场和发展
Nil20812 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣13 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
qeen8715 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI16 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
冻柠檬飞冰走茶16 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
民乐团扒谱机17 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
evans在进步17 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode