删除有序数组中的重复项 II
今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II
题目描述
给定一个排序好的数组 nums,请原地删除重复出现的元素,使得每个元素最多出现两次,并返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
- 示例:
- 输入:
nums = [1,1,1,2,2,3] - 输出:
[1,1,2,2,3], 新长度为 5 - 输入:
nums = [0,0,1,1,1,1,2,3,3] - 输出:
[0,0,1,1,2,3,3], 新长度为 7
- 输入:
题目分析
题目要求我们删除一个已排序数组中的重复元素,使得每个元素最多出现两次。我们需要在原地修改数组,并且只能使用常数级别的额外空间。
重点注意的地方是已排序的数组,因为已排序的数组,有需要原数组操作比较,我们可以优先考虑一下双指针法进行求解。在移出重复元素的简单难度中也分析过。只不过我们需要考虑得到是之前移出到只有一个元素,现在保留两个,那么我们指针的间距和起始位置也要修改。
解题思路
直接考虑双指针法,需要注意的就是两个指针的作用及起始位置。
双指针法:
- 特殊情况长度不足的直接返回。
- 定义一个慢指针,用于去重后的数组指针,指针大小为2,因为作为有序数组,前两个元素可以直接放入到结果数组中。
- 定义一个快指针,对数组进行循环,并且从索引2开始进行,因为有序数组,前两个一定是符合要求的元素。
- 当前数组的元素(快指针)与结果数组(慢指针)下标前两个位置的元素进行比较。如果值不相同,说明这个元素需要放到结果数组中去,同时因为放入结果数组,慢指针的值需要加1。如果相等跳过无需处理。
最后输出慢指针的值,就是结果数组的长度。
实际算法代码
下面是通过以上分析使用双指针法的 Java 实现:

最低0.47元/天 解锁文章
911

被折叠的 条评论
为什么被折叠?



