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

总结

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

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

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

相关推荐
JAVA面经实录9171 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
开源Z3 小时前
LeetCode 42 · 接雨水:从暴力到双指针的三步优化
算法·leetcode
旖-旎3 小时前
《LeetCode 695 岛屿的最大面积 FloodFill DFS 解法》
c++·算法·力扣·深度优先遍历·floodfill
syagain_zsx4 小时前
STL 之 vector 讲练结合
c++·算法
MartinYeung55 小时前
[论文学习]DP2Unlearning:高效且具保证的大型语言模型遗忘框架(基于差分隐私的 LLM Unlearning 方法)
学习·算法·语言模型
Tian_Hang5 小时前
C++原型模式(Protype)
开发语言·c++·算法
bIo7lyA8v5 小时前
算法复杂度的渐进分析与实际运行时间的差异的技术8
算法
yuan199976 小时前
欧拉梁静力与屈曲计算的 MATLAB 实现(有限差分法 + 解析解)
开发语言·算法·matlab
汉克老师7 小时前
GESP7级C++考试语法知识(二、指数函数(3、综合练习)
c++·算法·数学建模·指数函数·gesp7级·复利