###题目
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度,你不需要考虑数组中超出新长度后面的元素。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 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