貪欲で 最後の マスに 着けるかを判定する
すごろくの
海外で定番の問題リスト 4 本には入っていません
問題
すごろくのi からは 1 歩以上 steps[i] 歩以下のsteps[i] が 0 のlen(steps) - 1) にtrue、false を
- 後ろへ
戻る ことは できません - 最後の
マスを 越える 歩数を 選ぶことは できませんが、 上限が 大きい マスから 少ない 歩数を 選ぶことはできます - マスが 1 つだけなら、
最初から 最後の マスに いるので trueです stepsの長さは 1 以上 100000 以下、 値は どれも 0 以上 100000 以下です
入力と出力の例
例 1
マス 0 から 1 へ
例 2
マス 0、
例 3
マスが 1 つだけなので、
面接での聞かれ方
面接では、
- 「各要素が
そこから 跳べる 最大の 距離を 表す配列が あります。 最後まで 行けますか」 - 最初に
動的計画法で 書き、 「もっと速くできますか」と 聞かれて 貪欲に 直す流れもあります - 解けたら
「最少で 何回跳べば 着きますか」と、 次の 問題へ 広げられる こともあります
値が
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
素直にsteps[i] 個の
段 2
マス j にj よりj に
段 3
最もfar を 0 からfar よりfalse です。far を i + steps[i] とのfar がtrue を
解答
Python
Python
def can_reach_end(steps):
last = len(steps) - 1
far = 0
for i, v in enumerate(steps):
if i > far:
return False
far = max(far, i + v)
if far >= last:
return True
return TrueJavaScript
JavaScript
function canReachEnd(steps) {
const last = steps.length - 1;
let far = 0;
for (
let i = 0;
i < steps.length;
i++
) {
if (i > far) {
return false;
}
far = Math.max(
far, i + steps[i],
);
if (far >= last) {
return true;
}
}
return true;
}Go
Go
func canReachEnd(
steps []int,
) bool {
last := len(steps) - 1
far := 0
for i, v := range steps {
if i > far {
return false
}
far = max(far, i+v)
if far >= last {
return true
}
}
return true
}最後の return true には、far が 0 以上にtrue を
計算量
- 時間は O(n) です。
マスを 前から 1 回なめ、 1 マスごとの 手間は一定です - 使う
記憶は O(1) です。 持つのは farとlastだけです - 段 1 の
印を 付ける 書き方は O(n²) かかり、 印の 並びに O(n) の 記憶も要ります
よく ある間違い
- いつも
最大の 歩数で跳ぶ。 [2, 4, 0, 0, 1, 0]でマス 0 から 最大の 2 歩を 跳ぶと、 値が 0 の マス 2 で 止まります。 1 歩で マス 1 へ 行けば、 4 歩で 最後の マス 5 に 着けます。 1 本の 道を 選ぶのではなく、 届く 範囲を まとめて持ちます farより後ろの マスでも 広げてしまう。 i > farの確かめを 忘れると、 例 2 で マス 4 の 値 5 を 使い、 最後の マスに 着けると 答えてしまいます - 最後の
マスの 値を 気にする。 最後の マスの 値が 0 でも、 着けば 済みです。 例 1 の 最後の マスの 値は 1 ですが、 0 でも 答えは 変わりません - マスが 1 つの
ときに falseを返す。 例 3 のように、最初の マスが 最後の マスなので trueです
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「ある
マスに 着けるなら、 それより 手前の マスにも 全部着けます。 なので、 着ける マスは 先頭から ひと 続きで、 届く 最も 遠い マスを 1 つ 持てば足ります。 前から 見て、 いまの マスが 届く 範囲の 外なら false、 範囲の 中なら 届く 最も 遠い マスを 広げ、 最後の マスに 届いたら true です。 時間は O(n)、 記憶は O(1) です。」
書き終えたら、
「例 2 で
たどります。 マス 0 で 届く 最も 遠い マスは 2、 マス 1 では 1 + 1 で 2 のまま、 マス 2 では 2 + 0 で 2 のままです。 マス 3 は 3 が 2 より 大きいので 届かず、 false を 返します。 マス 4 の 5 は、 着けないので 使えません。」