c++删除数组中重复元素_leetcode 80 删除排序数组中的重复项Ⅱ(c++)

2b22f134bf55ed915a8dca7d3e044f21.png

###题目

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度,你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

  • 输入: [1,1,1,2,2,3],
  • 输出:5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。
  • 输入 : [0,0,1,1,1,1,2,3,3],
  • 输出:7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。

###思路

看到是排序数组的时候,其实难度就降低了不少,设置三个指针p1、p2、p3,其中p3指向数组中下一个可以被覆盖的位置,p1、p2分别指向一个连续相同数字序列的首部和尾部,这样当

时,代表已经除了这个相同连续数字序列,所以p2-p1就是上一个相同数字序列的长度,如果
,那么将nums[p3]、nums[p3+1]赋值为该数字,否则只将nums[p3]赋值为该数字,然后p3指向下一个可以覆盖的位置。

###code

class 

###思路

将上述代码进行优化:

  • 设置i、j。i 是遍历指针,指向当前遍历的元素,j指向下一个要覆盖的位置。
  • 利用count记录当前数字出现的次数,count的最小计数为1。
  • 因为count最小为1,从索引1遍历数组。
  • 若当前数字与前一个数字相同,
    ,那么count++。如果
    ,说明遇到了超过两个的重复项。此时,只向前移动 i,j不动。
  • ,将i所指向的数字移动到 j 位置,同时增加 i 和 j。
  • 若当前元素与前一个元素不相同,即
    ,说明遇到了新元素,更新
    ,并且将该元素移动到 j 位置,并同时增加 i 和 j。
  • 当数组遍历完成,则返回 j。

###code

class 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值