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

总结

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

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

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

相关推荐
中微极客5 小时前
降维算法75倍加速:从PCA到稀疏字典学习的工程实践
人工智能·学习·算法
storyseek5 小时前
前缀和实现Kogge-Stone算法
数据结构·算法
元Y亨H5 小时前
开发者必须掌握的十大核心算法
算法
元Y亨H5 小时前
深度解构:数据结构与算法的理论基石与工程演进
数据结构·算法
元Y亨H6 小时前
数据结构与算法的通俗指南
数据结构·算法
2301_764441336 小时前
用动力学系统(微分方程)为 Kernberg 的客体关系单元提供数学化的操作定义,把“自体—客体“这对心理结构建模成一个二维耦合系统
数据结构·python·算法·数学建模
林泽毅6 小时前
PyTRIO快速入门(二):Datum构建
人工智能·算法·产品
keep intensify6 小时前
最长有效括号
算法·leetcode·动态规划
CoderYanger6 小时前
A.每日一题:1979. 找出数组的最大公约数
java·程序人生·算法·leetcode·面试·职场和发展·学习方法
猫头虎7 小时前
什么是ZCode for GLM-5.2?
开发语言·人工智能·python·科技·算法·ai编程·ai写作