HOME/Articles/

Leetcode75-10

Article Outline

説明

  • int配列を探索して0だったら末尾に移動する。それ以外の数字の並び順は保持する。
  • 原文

    Given an integer array nums, move all 0's to the end of it while maintaining the relative order of the non-zero elements. Note that you must do this in-place without making a copy of the array.

例題との相違点

  • 自分の回答(29ms)
    • 0だったらその要素の前後で配列を2つに分割しくっつける、そして一番最後に0を追加する。
    • しかしこの方法は配列を他にコピーしないという制約に引っかかっていそう
func moveZeroes(nums []int)  {
    j := 0
    for i:=0; i < len(nums)-j; i++{
        if nums[i] == 0 {
            nums = append(append(nums[:i], nums[i+1:]...),0)
            j++
            i--
        }
    }
}
  • 最速の回答
func moveZeroes(nums []int) {
    if nums == nil {
        return 
    }

    left, right := 0, 0
    for right < len(nums) {
        if nums[right] != 0 {
            if left != right {
                nums[left], nums[right] = nums[right], nums[left]
            }
            left++
        }
        right++
    }
}

相違点

  • 左から探索し、0の塊の左と右のインデックスを保持している。
  • 右のインデックスの値が0だったら塊に加える(つまり右のインデックスを1つ進めるだけにする。)
  • 右のインデックスの値が0以外だったら、左のインデックスの値(つまり左端の0)と入れ替える。

感想

  • 配列の要素を入れ替えるだけという発想がない
  • 左から順に探索していって、その1回のみで達成できる方法を検討する。