题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解法:双指针
在解题前,需要明确如下几点:
1、原地修改输入数组并且在O(1)
的空间复杂度完成,那么可以明确不能用额外的数组;
2、元素的相对顺序保持一致,那么不能打乱元素的顺序。
考虑使用双指针法,如果两个指针指向的一致,则只需要将右指针向右移动一个空间。如果值不一致,将左指针向右移动一个空间,然后将左指针指向的值修改为右指针指向的值,继续将右指针向右移动一个空间。
代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) {
return 0;
}
int left= 0;
int right = 1;
while (right < nums.size()) {
if (nums[left] != nums[right]) {
++left;
// 只有当left和right值不等的时候,才需赋值,减少拷贝次数
if (left != right) {
nums[left] = nums[right];
}
}
++right;
}
return left + 1;
}
};
时间复杂度为O(n)
,空间复杂度为O(1)
,执行结果如下: