数组 - 移除元素

63 阅读1分钟

数组 - 移除元素

本题以力扣上的27号题目为例,大概就是给定一个序列(无序),再给一个目标值,需要将序列中的等于目标值的元素删除,最后返回删除后的序列大小。

image.png 在这个序列中,我们想要把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
}

记住:慢指针一定是指向最新数组的最新下标。当快指针所指向的值等于目标值,快慢指针出现异位