数组 - 移除元素
本题以力扣上的27号题目为例,大概就是给定一个序列(无序),再给一个目标值,需要将序列中的等于目标值的元素删除,最后返回删除后的序列大小。
在这个序列中,我们想要把9删除,本质上是将9这个位置给覆盖,把9后面的元素全都往前移动,至于最后一个位置是什么都可以。
讲到这里,我们其实很容易就想到怎么做。
func removeElement(nums []int, val int) int {
if len(nums) == 0 {
return 0
}
res := make([]int, len(nums))
index := 0
for _, num := range nums{
if num != val {
res[index] = num
index++
}
}
return index
}
上面这种做法其实也是可以的,并且时间复杂度也是O(n),但是我们需要额外花费空间存储新的数组。这个新的数组其实可以不用。
具体做法就是我们继续沿用原始数组。使用双指针方式,慢指针记录最新数组的最新下标,快指针记录原始数组的移动下标
如果快指针所指向的下标不等于目标值,讲快指针所在的数据赋值给慢指针,并且快慢指针一直增加。 如果快指针所指向的下标等于目标值,快指针继续增加,慢指针不变,因为此时快指针所指向的值我们最新数组不需要存储。
func removeElement(nums []int, val int) int {
if len(nums) == 0 {
return 0
}
slow, fast := 0, 0
for ; fast < len(nums); fast++{
if nums[fast] != val {
nums[slow] = nums[fast]
slow++
}
}
return slow
}
记住:慢指针一定是指向最新数组的最新下标。当快指针所指向的值等于目标值,快慢指针出现异位