给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
解题思路 前提是数组是有序的,不具备开启额外空间,就是需要再原有数组中去进行排序,方法:双指针,设置2个指针,1个慢指针(slow),一个快指针(fast),其中slow指针表示最终的数组长度,每个元素只能出现2次,那就是说我们可以从第2个开始进行遍历,数组小于2 的直接返回结果。先寻找判断条件,如果nums[slow-2] == nums[fast],当前元素与上上一个元素相等时,那么就不应该保留 (因为此时必有nums[slow-2] == nums[slow-1] == nums[fast]),如果不相等那就需要保留nums[fast],结束条件fast<nums.count
func removeDuplicates(_ nums: inout [Int]) -> Int {
let n = nums.count;
if n <= 2 {
return n
}
var slow = 2, fast = 2
while fast < n {
if nums[slow - 2] != nums[fast] {
nums[slow] = nums[fast]
slow += 1
}
fast += 1
}
return slow
}