LeetCode 80. 删除有序数组中的重复项 II (1/100)

日期: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;
} 

5 运行结果

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值