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

总结

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

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

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

相关推荐
find1star8 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing8 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21128 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP9 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN10 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183110 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤11 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate11 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran11 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹12 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统