快慢指针解决删除排序数组中的重复项问题(go语言代码)

快慢指针解决删除排序数组中的重复项问题

最近在leetcode 遇到关于删除排序数组中的重复项问题,我一开始使用了暴力的方法,重复就进行数组覆盖的方法,后来看到他人题解我才知道这也是个快慢指针问题

1.基础版 排序数组中只能重复一次的问题

26. 删除有序数组中的重复项 <-点击跳转

这个就比较好想了,首先<=1的直接返回(不可能重复),然后快慢指针直接从1下标开始,如果快指针发现自己走到了和上一个不一样的数据,让目前的慢指针指向的数据和快指针的数据交换(记录新的数据),然后再让慢指针+1(因为慢指针本来就是1相当于第一个数,加一就记录了有第二不同的数,顺便挪位置,准备接纳下一个不同的数),直到快指针遍历完数组

上代码:

func removeDuplicates(nums []int) int {
    n := len(nums)
    if n == 0 {
        return 0
    }
    s := 1
    for f := 1; f < n; f++ {
        if nums[f] != nums[f-1] { 
            nums[s] = nums[f]
            s++
        }
    }
    return s
}

2.进阶版 排序数组中只能重复2次的问题

80. 删除有序数组中的重复项 II

这道题直接给我干蒙了,按照上面那个思路,这个不好办,因为不知道会重复几次,通过快指针判断不了,所以要从慢指针那里思考,因为慢指针一开始是不动的。
那么,2一下的数组不判断直接返长度,快指针不断向后加一,慢指针-2和快指针相比较(因为要求重复不超过2),如果不相符,就让慢指针的数据和快指针交换,之后慢指针再加一挪位置(由于一开始为2相当于记录了数组初始长度,如果不相同就加一就记录了添加新的数据的长度),直到快指针走到末尾。

上代码:

func removeDuplicates(nums []int) int {
    l := len(nums)
    if l <= 2 {
        return l
    }
    i := 2
    j := 2
    for ; j < l ; j++ {
        if nums[i - 2] != nums[j] {
            nums[i] = nums[j]
            i++
        }
    }
    return i
}
posted @ 2022-04-15 22:24  JiaoMaster  阅读(55)  评论(0编辑  收藏  举报