LC 26数组与双指针简单第 2 / 95 题

删除有序数组中的重复项

Remove Duplicates from Sorted Array

双指针原地操作
本机进度仅保存在当前浏览器

题目描述

给你一个升序排列的数组 nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回新长度。要求空间复杂度为 O(1)。

示例:nums = [0, 0, 1, 1, 1, 2],输出长度 3,前三个元素为 [0, 1, 2]。

解题思路

  1. 数组有序,所以重复元素一定相邻,这是本题能用快慢指针的前提。
  2. 慢指针左侧始终是「已去重的前缀」;快指针遇到与前一保留元素不同的新值时,把它追加到慢指针处。
  3. 第一个元素必然保留,因此慢指针从 1 开始。

参考实现

查看参考实现Python · 建议先自行作答
def removeDuplicates(nums):
    if not nums:
        return 0
    # slow 左侧区间为已去重前缀
    slow = 1
    for i in range(1, len(nums)):
        if nums[i] != nums[slow - 1]:
            nums[slow] = nums[i]
            slow += 1
    return slow

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类数组与双指针
题源LeetCode 26

关联教程

返回题图鉴