每日一道算法题

45 阅读1分钟

给你一个有序数组 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
    }