快慢指针解决删除排序数组中的重复项问题(go语言代码)
快慢指针解决删除排序数组中的重复项问题
最近在leetcode 遇到关于删除排序数组中的重复项问题,我一开始使用了暴力的方法,重复就进行数组覆盖的方法,后来看到他人题解我才知道这也是个快慢指针问题
1.基础版 排序数组中只能重复一次的问题
这个就比较好想了,首先<=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次的问题
这道题直接给我干蒙了,按照上面那个思路,这个不好办,因为不知道会重复几次,通过快指针判断不了,所以要从慢指针那里思考,因为慢指针一开始是不动的。
那么,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
}