HOME/Articles/

Leetcode75-18

Article Outline

説明

  • 与えられた0と1の配列から、連続した1の最大数を返す。
  • ただし与えられた数分の0を1に置換してよい
  • 原文

Given a binary array nums and an integer k, return the maximum number of consecutive 1's in the array if you can flip at most k 0's.

例題との相違点

  • 自分の回答(167ms)
    • for文を回して、連続する1を数えた。
    • 0を1に置換できる数分の配列を用意し、置換した0まで、0を含めて何個の1が並んでいるかを格納した。
    • 要素が0のときに、その配列を左にシフトし、インデックス0の値を最大値から引いた。
    • 以上を繰り返すことで探索を行った。
func longestOnes(nums []int, k int) int {

    // 連続した1の要素数を保持する、k分の配列が必要
    seqOne := make([]int, k)
    tmeseq := 0

    // 0を含めて連続した1の最大値を保持する
    maxLength := 0

    allMaxLength := 0

    // 0がkの値以上反転されたら、最初の連続1をリセットし、その要素分を反転0と1の連続数から引く
    for _, num := range nums {

        if num == 1 {
            maxLength++
            tmeseq++
        } else {
            if len(seqOne) == 0 {
                maxLength = 0
            } else {

                if seqOne[0] > 0 {
                    maxLength -= seqOne[0]
                }

                shiftLeft(seqOne)

                seqOne[k-1] += tmeseq + 1
                maxLength++
                tmeseq = 0
            }

        }
        if maxLength > allMaxLength {
            allMaxLength = maxLength
        }

    }
    return allMaxLength
}

func shiftLeft(seqOne []int) {
    copy(seqOne[0:], seqOne[1:])
    seqOne[len(seqOne)-1] = 0
}
  • 回答例(48ms)
    • rとlを使って、尺取虫のように探索している。
    • 先頭を進めていって、伸ばせるところまで伸ばしたら、終端を進める。
    • 0の使用量が復活したらまた先頭を進める。
func longestOnes(nums []int, k int) int {
    l, r := 0, 0
    ans := 0

    for r < len(nums) {
        if nums[r] == 1 {
            r++
        } else {
            if k >0 {
                r++
                k--
            }else{
                if nums[l] == 0 {
                    k++
                }
                l++
            }
        }
        ans = max(ans, r-l)
    }

    return ans
}

感想

  • まだシンプルに考える力が足りない。