返回

剑指编程:LeetCode 80,轻松解决有序数组重复项!

后端

剑指编程,算法入门!今天我们聚焦 LeetCode 80:删除有序数组中的重复项 II。在这道中等难度算法题中,我们将学习如何高效地从一个有序数组中删除重复元素,但最多只能保留两个相同元素。

一、题目

给你一个有序数组 nums,请你删除其中重复的元素,使得每个元素最多出现两次,并返回最终数组的长度。

示例:

输入:nums = [1,1,1,2,2,3]
输出:5
解释:最终数组为 [1,1,2,2,3]

二、解决方案

为了从有序数组中删除重复元素,我们可以使用两种方法:

1. 双指针法

首先,我们需要定义两个指针, slowfastslow 指针指向当前要保存的元素,而 fast 指针指向当前正在扫描的元素。

然后,我们从数组的开头开始扫描,如果 fast 指针指向的元素与 slow 指针指向的元素不同,则将 fast 指针指向的元素复制到 slow 指针指向的位置,并移动 slow 指针。

如果 fast 指针指向的元素与 slow 指针指向的元素相同,则继续移动 fast 指针,直到 fast 指针指向的元素与 slow 指针指向的元素不同或 fast 指针指向数组的末尾。

fast 指针指向数组的末尾时,扫描结束,我们返回 slow 指针指向的位置作为最终数组的长度。

2. 计数法

另一种删除重复元素的方法是使用计数法。

首先,我们需要定义一个数组 count,其中 count[i] 表示数组 nums 中元素 i 出现的次数。

然后,我们从数组的开头开始扫描,如果 count[nums[i]] 小于 2,则我们将 nums[i] 加入最终数组,并使 count[nums[i]] 加 1。

count[nums[i]] 等于 2 时,我们跳过 nums[i]

当我们扫描完整个数组时,我们返回最终数组的长度。

三、代码示例

C++ 代码:

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 0, fast = 1;
        while (fast < n) {
            if (nums[fast] != nums[slow]) {
                nums[slow + 1] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow + 1;
    }
};

Java 代码:

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n <= 2) {
            return n;
        }
        int slow = 0, fast = 1;
        while (fast < n) {
            if (nums[fast] != nums[slow]) {
                nums[slow + 1] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow + 1;
    }
}

Python 代码:

def removeDuplicates(nums):
    n = len(nums)
    if n <= 2:
        return n
    slow = 0
    fast = 1
    while fast < n:
        if nums[fast] != nums[slow]:
            nums[slow + 1] = nums[fast]
            slow += 1
        fast += 1
    return slow + 1

四、结语

以上就是 LeetCode 80:删除有序数组中的重复项 II 的两种解法。希望本文对您的学习有所帮助。