文章目录
- 1、描述
- 2、关键字
- 3、思路
- 4、notes
- 5、复杂度
- 6、code
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
题目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;}
};