题干
给你一个 非严格递增排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。 - 返回
k。
题解--双指针
考察双指针中的快慢指针,和LeetCode27思路是类似的。使得慢指针指向当前要已检查的数组边界,slow之前的数组满足元素不重复的特点,快指针不断前进,遍历数组中的每一个数。当快指针指向的数和慢指针指向的前一个数不相等,则将快指针指向的数赋值给慢指针指向的数,并将慢指针(即已检查的数组边界)后移,如此循环直到快指针走到数组尾部,结束循环,返回当前慢指针指向的位置(即数组边界)作为结果。
- 时间复杂度:O(n)
- 空间复杂度:O(1)
import "fmt"
func removeDuplicates(nums []int) int {
slow, fast := 1, 1
for fast < len(nums) {
if nums[fast] != nums[slow-1] {
nums[slow] = nums[fast]
slow++
}
fast++
}
return slow
}
func main() {
nums := []int{1, 1, 2}
num := removeDuplicates(nums)
fmt.Println(nums)
fmt.Println(num)
nums = []int{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}
num = removeDuplicates(nums)
fmt.Println(nums)
fmt.Println(num)
}