题干
给你一个数组 nums **和一个值 val,你需要原地移除所有数值等于 val **的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
题解--快慢指针
题目只关心前k个值,只要前k个值里面没有等于k的就满足要求,那么很自然想到双指针中的快慢指针,快指针负责寻找不等于val的值,一旦找到就把值吐给慢指针所指向的位置,慢指针永远指向下一个接收不等于val的值的位置,直到快指针走完整个列表,意味着快指针已经找到了所有不等于val的值,返回慢指针指向的位置,即为列表中不等于val的个数。
- 时间复杂度O(n)
- 空间复杂度O(1)
import "fmt"
func removeElement(nums []int, val int) int {
var slow, fast int
for fast < len(nums) {
if nums[fast] != val {
nums[slow] = nums[fast]
slow++
}
fast++
}
return slow
}
func main() {
nums := []int{3, 2, 2, 3}
val := 3
removeElement(nums, val)
fmt.Println(nums)
nums = []int{0, 1, 2, 2, 3, 0, 4, 2}
val = 2
removeElement(nums, val)
fmt.Println(nums)
}