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

总结

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

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

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

相关推荐
加农炮手Jinx3 小时前
LeetCode 88. Merge Sorted Array 题解
算法·leetcode·力扣
格林威3 小时前
线阵工业相机:如何计算线阵相机的行频(Line Rate)?公式+实例
开发语言·人工智能·数码相机·算法·计算机视觉·工业相机·线阵相机
yueyue5433 小时前
透过现象看本质:以fast_lio架构的整套算法的局部避障改为TEB算法为例深度探讨——如何成为一个合格的算法架构师?
算法·架构
梨花爱跨境3 小时前
红人视频×A10算法:亚马逊转化率与流量闭环实战
算法
阿Y加油吧3 小时前
二刷 LeetCode:75. 颜色分类 & 31. 下一个排列 复盘笔记
笔记·算法·leetcode
风筝在晴天搁浅3 小时前
LeetCode 378.有序矩阵中第K小的元素
算法·矩阵
小雅痞3 小时前
[Java][Leetcode middle] 3. 无重复字符的最长子串
java·开发语言·leetcode
qeen873 小时前
【算法笔记】简单贪心
c++·笔记·算法·贪心算法
ting94520003 小时前
动手学深度学习(PyTorch版)深度详解(10): 优化算法 全解
人工智能·pytorch·深度学习·算法