Follow up for “Remove Duplicates”:What if duplicates are allowed at most twice?
For example,Given sorted array nums = [1,1,1,2,2,3], Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn’t matter what you leave beyond the new length.
与26. Remove Duplicates from Sorted Array的差别是,这次数组的元素可以出现一次或者两次,超过两次的要删掉。26题中的思路1是没法用了,思路2和思路3还是可以继续用的。
方法1:时间复杂度O(n2)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
for(int i=2; i<nums.size(); i++)
{
if(nums[i]==nums[i-2])
{
nums.erase(nums.begin()+i);
i--;
}
}
return nums.size();
}
};
方法2:时间复杂度O(n): 这个改进版本为什么不能把26题中的i-1直接改成i-2呢?如果要是直接这样改的话,看一下这个例子: 1 1 1 2 2 3 4,当处理到nums[3]的时候,把2存到数组前面,数组变成 1 1 2 2 2 3 4,这个时候再处理nums[4]结果就错了。所以呢,我们还是得相邻元素作比较,要设置一个flag变量标记下,保证元素数目不要超过2. 当前后元素相等的时候,看一下flag如果是1说明前面只有一个该元素,此时将flag置为2,把该元素再存入数组前面,如果flag是2说明前面至少有两个该元素,就什么都不做。如果前后元素不相等的情况下,直接将flag置为1开始重新计数,并且把该元素存入数组前面。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty())
return 0;
int j=1,flag=1;
for(int i=1; i<nums.size(); i++)
{
if(nums[i]==nums[i-1])
{
if(flag==1)
{
flag++;
nums[j++]=nums[i];
}
}
else
{
flag=1;
nums[j++]=nums[i];
}
}
return j;
}
};
不拼搏,枉少年,加油!
以上就是关关关于这道题的总结经验,希望大家能够理解,有什么问题可以在我们的专知公众号平台上交流或者加我们的QQ专知-人工智能交流群 426491390,也可以加入专知——Leetcode刷题交流群(请先加微信小助手weixinhao: Rancho_Fang)。
-END-
欢迎使用专知
专知,一个新的认知方式!目前聚焦在人工智能领域为AI从业者提供专业可信的知识分发服务, 包括主题定制、主题链路、搜索发现等服务,帮你又好又快找到所需知识。
使用方法>>访问www.zhuanzhi.ai, 或点击文章下方“阅读原文”即可访问专知
中国科学院自动化研究所专知团队
@2017 专知
专 · 知
关注我们的公众号,获取最新关于专知以及人工智能的资讯、技术、算法、深度干货等内容。扫一扫下方关注我们的微信公众号。