Skip to content

26.删除有序数组中的重复项

一、问题描述

给定一个已排序的整数数组 nums,你需要原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例:

plaintext
给定 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。

二、方案一:双指针

1、思路

定义两个指针 slow 和 fastslow 初始化为 1,用于指向数组中不重复元素的开始位置。fast 初始化为 1,用于遍历数组。

使用 fast 指针遍历数组,如果 fast 指针指向的元素不等于 slow-1 指针指向的元素(即不是重复元素),则将 fast 指针指向的元素复制到 slow 指针指向的位置。

2、代码实现

go
func removeDuplicates(nums []int) int {
    // 初始化两个指针,slow 和 fast
    slow, fast := 1, 1

    // 使用 fast 指针遍历数组,使用 slow 指针记录不重复元素的位置
    for fast < len(nums) {
        // 如果 fast 指针指向的元素不等于 slow-1 指针指向的元素(即不是重复元素)
        if nums[fast] != nums[slow-1] {
            // 将 fast 指针指向的元素复制到 slow 指针指向的位置
            nums[slow] = nums[fast]
            // 移动 slow 指针到下一个位置
            slow++
        }
        // 移动 fast 指针到下一个位置
        fast++
    }

    // 返回不重复元素的新长度
    return slow
}

木川工作室 (微信:mcmc2024)