剑指编程:LeetCode 80,轻松解决有序数组重复项!
2023-10-16 12:59:07
剑指编程,算法入门!今天我们聚焦 LeetCode 80:删除有序数组中的重复项 II。在这道中等难度算法题中,我们将学习如何高效地从一个有序数组中删除重复元素,但最多只能保留两个相同元素。
一、题目
给你一个有序数组 nums
,请你删除其中重复的元素,使得每个元素最多出现两次,并返回最终数组的长度。
示例:
输入:nums = [1,1,1,2,2,3]
输出:5
解释:最终数组为 [1,1,2,2,3]
二、解决方案
为了从有序数组中删除重复元素,我们可以使用两种方法:
1. 双指针法
首先,我们需要定义两个指针, slow
和 fast
。slow
指针指向当前要保存的元素,而 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 的两种解法。希望本文对您的学习有所帮助。