HOME/Articles/

Leetcode75-4

Article Outline

例題との相違点

  • 自分の回答
func canPlaceFlowers(flowerbed []int, n int) bool {

    arrangeArray := append([]int{0}, flowerbed...)
    arrangeArray = append(arrangeArray, 0)


    for i := 1; i < len(flowerbed)+1; i++{
        if arrangeArray[i-1] == 0 && arrangeArray[i] == 0 && arrangeArray[i+1] == 0{
            arrangeArray[i] =1
            n--
        }
    }

    return n<=0;
}
  • 最速の例題
func canPlaceFlowers(flowerbed []int, n int) bool {
    var available int

    for i := 0; i < len(flowerbed); i++ {
        if flowerbed[i] != 0 {
            continue
        }

        prevIsZero := i == 0 || flowerbed[i-1] == 0
        nextIsZero := i == len(flowerbed)-1 || flowerbed[i+1] == 0

        if prevIsZero && nextIsZero {
            flowerbed[i] = 1
            available++
        }
    }

    return available >= n
}
  • 違い
    • 確認箇所が0じゃなかったらそもそも置けないから飛ばしている
    • 外からの変数(n)ではなく、関数内で定義した変数(available)を操作している。
    • 配列操作をせずに、条件で最初と最後の要素を処理している。(以下のところ)
      prevIsZero := i == 0 || flowerbed[i-1] == 0
      nextIsZero := i == len(flowerbed)-1 || flowerbed[i+1] == 0
  • 検証

    • arrangeArray[i] == 0 を一番最初に評価したら2~4ms早くなった

    • 関数内の変数を使うようにしたら2ms早くなった

    • 1をセットするときに、i++したら余計に遅くなった。(処理する配列は少なくなるのになぜ?)

    • 配列操作を減らしてもあまり変わらない

    • 前後を判定する前に、インデックスi の箇所が0じゃなったら飛ばすのが最も早い。

    • 以下の形が、自分の回答を最も早くした形。

      func canPlaceFlowers(flowerbed []int, n int) bool {
      ava := 0
      
      arrangeArray := append([]int{0}, flowerbed...)
      arrangeArray = append(arrangeArray, 0)
      
      for i := 1; i < len(flowerbed)+1; i++{
          if arrangeArray[i] == 0 && arrangeArray[i-1] == 0 && arrangeArray[i+1] == 0{
              arrangeArray[i] =1
              ava++
          }
      }
      
      return n<=ava;
      }