LeetCode283 移动零(扩展:移除元素)

79 阅读1分钟

leetcode.cn/problems/mo…

image.png

解法1:双指针

左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移

关键点:

  1. 左指针左边均为非零数
  2. 右指针左边至左指针之间均为零
func moveZeroes(nums []int)  {
    // 左,右指针
    left, right := 0, 0
    for right < len(nums){
        if nums[right] != 0 {
            nums[left], nums[right] = nums[right], nums[left]
            left++
        }
        right++
    }
}

解法2:删除0

先移除所有 0,然后把最后的元素都置为 0,就相当于移动 0 的效果。

func moveZeroes(nums []int)  {
    // 移除0后的数组长度
    subArrayLen := removeZero(nums)
    for i:= subArrayLen; i<len(nums); i++{
        nums[subArrayLen] = 0
    }
}

func removeZero(nums []int) int{
    fast, slow := 0, 0
    for fast < len(nums){
        if nums[fast] != 0{
            nums[slow], nums[fast] = nums[fast], nums[slow]
            slow++
        }
        fast++
    }
    return slow
}

扩展:移除元素

image.png

解法一:双指针

func removeElement(nums []int, val int) int {
    left, right := 0, 0
    for right < len(nums){
        if nums[right] != val{
            nums[left], nums[right] = nums[right], nums[left]
            left++
        }
        right++
    }
    // nums[0...left-1]存放不等于val的元素
    // 最后一次移动后,left指向第一个等于val的元素
    return left
}