2021-09-20:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]。输出:2, nums = [1,2,_]。

福大大 答案2021-09-20:

双指针。慢指针相当于map,快指针遍历数组一次。快指针等于慢指针时,快指针加1;快指针不等于慢指针时,快慢指针都加1。
时间复杂度:O(N)。
空间复杂度:O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
    nums := []int{1, 1, 2, 2}
    ret := removeDuplicates(nums)
    fmt.Println(ret)
    fmt.Println(nums)
}

func removeDuplicates(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    if len(nums) < 2 {
        return len(nums)
    }
    done := 0
    for i := 1; i < len(nums); i++ {
        if nums[i] != nums[done] {
            done++
            nums[done] = nums[i]
        }
    }
    return done + 1
}

执行结果如下:
图片


左神java代码