0080. 删除有序数组中的重复项 II #
- 标签:数组、双指针
- 难度:中等
题目大意 #
描述:给定一个有序数组 nums
。
要求:在原数组空间基础上删除重复出现 2
次以上的元素,并返回删除后数组的新长度。
说明:
- $1 \le nums.length \le 3 * 10^4$。
- $-10^4 \le nums[i] \le 10^4$。
nums
已按升序排列。
示例:
- 示例 1:
|
|
- 示例 2:
|
|
解题思路 #
思路 1:快慢指针 #
因为数组是有序的,所以重复元素必定是连续的。可以使用快慢指针来解决。具体做法如下:
- 使用两个指针
slow
,fast
。slow
指针指向即将放置元素的位置,fast
指针指向当前待处理元素。 - 本题要求相同元素最多出现 2 次,并且
slow - 2
是上上次放置了元素的位置。则应该检查nums[slow - 2]
和当前待处理元素nums[fast]
是否相同。- 如果
nums[slow - 2] == nums[fast]
时,此时必有nums[slow - 2] == nums[slow - 1] == nums[fast]
,则当前nums[fast]
不保留,直接向右移动快指针fast
。 - 如果
nums[slow - 2] != nums[fast]
时,则保留nums[fast]
。将nums[fast]
赋值给nums[slow]
,同时将slow
右移。然后再向右移动快指针fast
。
- 如果
- 这样
slow
指针左边均为处理好的数组元素,而从slow
指针指向的位置开始,fast
指针左边都为舍弃的重复元素。 - 遍历结束之后,此时
slow
就是新数组的长度。
思路 1:代码 #
|
|
思路 1:复杂度分析 #
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。