LeetCode 26. 删除有序数组中的重复项【简单】

93 阅读1分钟

题干

给你一个 非严格递增排列 的数组 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)
}