给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
示例 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
不需要考虑数组中超出新长度后面的元素。
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
int n = nums.size(); // 获取数组的长度
if (n == 0) // 如果数组为空,则直接返回0
{
return 0;
}
int fast = 1, slow = 1; // 初始化快慢指针,都从数组的第二个元素开始(索引为1)
while (fast < n) // 当快指针没有遍历完整个数组时,继续循环
{
if (nums[fast] != nums[fast - 1]) // 如果快指针指向的元素与前一个元素不相等
{
nums[slow] = nums[fast]; // 将快指针指向的元素复制到慢指针指向的位置
++slow; // 慢指针向前移动一位,为新元素腾出空间
}
++fast; // 快指针总是向前移动
}
return slow; // 返回慢指针的位置,即新数组的长度
}
};
这个函数利用了双指针的技巧,在遍历数组的同时,将不重复的元素依次复制到数组的前面,从而达到移除重复项的目的。注意,这里并没有创建一个新的数组来存储结果,而是直接在原数组上进行修改,因此空间复杂度为 O(1)。