問題
毎日のdays を
daysの値は 0 か 1 だけです - 1 が 1 つも
無い ときは 0 を返します daysの長さは 1 以上 100000 以下です
入力と出力の例
例 1
1 は 2 日、
入力
days = [1, 1, 0, 1, 1, 1, 0, 1]出力
3例 2
1 が 1 つも
入力
days = [0, 0, 0]出力
0例 3
いちばん長い
入力
days = [0, 1, 1, 1, 1]出力
4面接での聞かれ方
面接では、
- 「0 と 1 の
配列で、 1 が 連続する 最大の 長さを 返してください」 - 書き終えた
あとに 「0 を 1 回だけ 1 に 変えて よいなら、 最長は いくつに なりますか?」と 続きを 聞かれます。 ここで、 左右の 端を 持つ窓の 考え方に つながります - 「並びが
流れてくる (最後まで 一度に 持てない ) としたら、 どう 書きますか?」と、 記憶の 使い方を 聞かれる こともあります
ジュニアの
アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。
まず 考える手順
段 1
まずは
段 2
1 が
段 3
いま続いている
解答
Python
Python
def max_consecutive_ones(days):
best = 0
run = 0
for d in days:
if d == 1:
run += 1
if run > best:
best = run
else:
run = 0
return bestJavaScript
JavaScript
function maxConsecutiveOnes(
days
) {
let best = 0;
let run = 0;
for (const d of days) {
if (d === 1) {
run++;
if (run > best) {
best = run;
}
} else {
run = 0;
}
}
return best;
}Go
Go
func maxConsecutiveOnes(
days []int,
) int {
best := 0
run := 0
for _, d := range days {
if d == 1 {
run++
best = max(best, run)
} else {
run = 0
}
}
return best
}best は 1 を
計算量
- 時間は O(n) です。
並びを 先頭から 1 回なめるだけです - 使う
記憶は O(1) です。 いまの 長さと 最長の 2 つの 数だけです
よく ある間違い
- 0 が
来た ときだけ 最長を比べる。 例 3 のように 並びが 1 で 終わると、 最後の 続きが 比べられずに 0 が 返ります。 比べるのを 0 の ときに するなら、 繰り返しの あとに もう 1 回比べます - 0 が
来ても 長さを 戻さない。 runを 0 に戻し忘れると、 ただ 1 の 個数を 数える ことに なり、 例 1 では 6 が返ります - 最長の
初めの 値を 1 にする。 「長さは 1 以上」と 思い込むと、 例 2 のように 1 が 無い ときに 0 を 返せません
解答を動かした版 Python 3.12.14Node.js 22.23.4Go 1.24.6確認日 2026年10月30日
面接での 話し方の例
書き始める
「各位置から
数え直すと O(n²) です。 1 が 続いている 間は 左の 端が 動かないので、 いまの 続きの 長さだけを 持ち、 1 なら 1 足して、 0 なら 0 に 戻します。 足すたびに 最長と 比べるので、 最後で 終わる 続きも 取り こぼしません。 時間は O(n)、 記憶は O(1) です。」
書き終えたら、
「例 3 の
[0, 1, 1, 1, 1]でたどります。 最初の 0 で 長さは 0 のままです。 そこから 1 が 4 つ 続き、 長さは 1、 2、 3、 4 と 増え、 そのたびに 最長も 4 まで 上がります。 並びが 終わった 時点で 4 を 返します。」
