文章目录
1、描述
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
题目1链接
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
2、关键字
重复元素,原地,一次,二次
3、思路
快慢指针
4、notes
因为只有不重复的需要拷贝,所以在分类的时候就写if(cur != nums[k])写需要拷贝的情况。
因为题目二允许最多出现2次,所以可以在相等的情况下也存在拷贝的情况,所以写if(cur==nums[k])
为了拓展性count记录一次两次三次,
5、复杂度
时间O(N)
空间O(1)原地
6、code
cpp
题目1,元素只能出现1次
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 0;
for(int i = 1; i < nums.size(); i++) {
if(nums[k] != nums[i]) { // 需要拷贝的情况(需要特殊处理,所以写这种情况)
k++;
nums[k] = nums[i];
}
}
return k + 1;
}
};
题目二:允许出现2次
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 0;
int cur = nums[0];
int count = 1; // 记录出现重复数字的个数,
for (int i = 1; i < nums.size(); i++) {
cur = nums[i];
if (nums[k] == cur ) { // 第一因素,是否与res最后一个元素相等
count++;
if (count < 3) { // 第二因素,如果相等,且数量不大于2,也要拷贝
k++;
nums[k] = cur;
}
}else { // 不相等直接拷贝
k++;
nums[k] = cur;
count = 1;
}
}
return k+1;
}
};