📌题目连接
这两道题虽然都要求使用O(1)
额外空间, 但是从解决问题的角度, 我们可以先从O(n)
的方案出发, 然后再优化
之前做这两道题, 虽然是做出来了, 但是没有优化, 使用了golang
切片特性, 毕竟当时刚开始刷题的时候, 能做出来几道题就很高兴了
📌26题
func removeDuplicates(nums []int) int {
i, j := 0, 1
for j < len(nums) {
if nums[i] == nums[j] {
nums = append(nums[:j], nums[j+1:]...)
} else {
i++
j++
}
}
return len(nums)
}
改造后的
func removeDuplicates(nums []int) int {
n := len(nums)
if n == 0 {
return 0
}
i, j := 0, 1
for j < n {
if nums[i] != nums[j] {
i++
nums[i] = nums[j]
}
j++
}
return i + 1
}
📌27题
func removeElement(nums []int, val int) int {
for i := len(nums) - 1; i >= 0; i-- {
if val == nums[i] {
nums = append(nums[:i], nums[i+1:]...)
}
}
return len(nums)
}
改造后
func removeElement(nums []int, val int) int {
n := len(nums)
i, j := 0, 0
for j < n {
if nums[j] != val {
nums[i] = nums[j]
i++
}
j++
}
return i
}
📌总结
这里的两个指针, 一快一慢, 同向, 我们可以先这样想: 开辟一个新的数组, 往里面装符合要求的元素, 这样做就会发现 新数组的指针总是比旧数组的指针要慢, 所以就没必要开辟新的数组了, 直接在原数组上操作