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

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

easy

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。

https://markdown-1303167219.cos.ap-shanghai.myqcloud.com/image-20220227162041412.png

原地删除

append 函数看起来蛮耗时的。。。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// removeDuplicates 比较蠢的 一次遍历
func removeDuplicates(nums []int) int {
	dupLen := 0
	oriLen := len(nums)
	for i := 0; i < len(nums)-1; {
		if nums[i] == nums[i+1] {
			nums = append(nums[:i+1], nums[i+2:]...) // 删除 i+1
			dupLen++
			// 此处不执行 i++
		} else {
			i++
		}

	}
	return oriLen - dupLen
}

双指针(重复元素后移)

一个指针 i 进行数组遍历,另外一个指针 j 指向有效数组的最后一个位置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// removeDuplicates 把重复的元素移到最后面 (其实是覆盖掉)
func removeDuplicates(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	i, j := 0, 0
	for i < len(nums)-1 {
		for nums[j] == nums[i] {
			// 右移j至与i不同处
			j++
			if j == len(nums) {
				return i + 1
			}
		}
		nums[i+1] = nums[j] // 覆盖 跟替换一个意思
		i++
	}
	return i + 1
}