日期:2021.4.6
难度:medium
1 题目描述
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
2 思路
重点
:假设每个元素最多出现k次(本题中k=2)
那么由于是保留 k个相同数字,对于前 k个数字,可以直接保留;
对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留
以[1,1,1,2,3]为例:
3 关键代码
- 注意形参为引用类型,这样实参才可以被修改
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
int len=0;
for(int i=0;i<nums.size();i++)
{
if(len<2 || nums[i]!=nums[len-2])
{
nums[len++]=nums[i];
}
}
return len;
}
};
4 全部代码
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
class Solution
{
public:
int removeDuplicates(vector<int>&nums,int k)//普适化函数
{
int len = 0;
for (int i = 0; i < nums.size(); i++)
{
if (len < k || nums[i] != nums[len-k])
nums[len++] =nums[i];
}
return len;
}
};
int main()
{
Solution M;
int a[6]={1,1,1,2,2,3};
vector<int> b(a,a+6);
/*等价于*/
//for(int i=0;i<6;i++)
//b.push_back(a[i]);//push_back()函数,在向量b后面加入一个值
cout<<"[";
for(int i=0;i<b.size()-1;i++)
{
cout<<b[i]<<",";
}
cout<<b[b.size()-1]<<"]"<<endl;
int len=M.removeDuplicates(b,2);
cout<<"[";
for(int i=0;i<len-1;i++)
{
cout<<b[i]<<",";
}
cout<<b[len-1]<<"]"<<endl;
}