貪欲で最後のマスまでの最少の跳ぶ回数を求める

貪欲法問題 164

すごろくのマスごとに進める歩数の上限が決まっているとき、最後のマスに着くまでの跳ぶ回数の最少を返す。「あと 1 回跳べば届く範囲」を段ごとに広げていけば、前から 1 回なめるだけで数えられます。

海外で定番の問題リスト 4 本には入っていません

問題

すごろくのマスが一列に並び、マス i からは 1 歩以上 steps[i] 歩以下の好きな歩数だけ前へ進めます。最初のマス (番号 0) から始めて、最後のマス (番号 len(steps) - 1) に着くまでの、跳ぶ回数の最少を返す関数を書いてください。

  • どの入力でも、最後のマスには必ず着けます
  • 後ろへ戻ることはできません
  • マスが 1 つだけなら、最初から着いているので答えは 0 です
  • steps の長さは 1 以上 100000 以下、値はどれも 0 以上 1000 以下です

入力と出力の例

例 1

マス 0 から 1 歩でマス 1 へ、4 歩でマス 5 へ、2 歩でマス 7 へ跳ぶ 3 回が最少です。マス 0 から 2 歩でマス 2 へ跳ぶと、そこからはマス 5 に届きません。

steps = [2, 4, 1, 1, 0, 3, 1, 2]
3

例 2

マスが 1 つだけなので、跳ぶ必要はありません。

steps = [0]
0

例 3

マス 0 から 5 歩で、1 回で最後のマスに着けます。

steps = [5, 1, 1, 1, 1, 1]
1

面接での聞かれ方

面接では、「最後まで行けるか」を判定する問題の続きとして出されることが多いです。

  • 「必ず最後まで行けるとして、最少で何回跳べばよいですか」
  • 最初に動的計画法や幅優先探索で書き、「記憶を O(1) にできますか」と聞かれて貪欲に直す流れもあります
  • 「着けない入力が来たらどうしますか」と、前提を聞かれることもあります

必ず着けるという前提があるかを、書く前に確かめておきます。前提が無いなら、着けないときに何を返すかを決めます。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def min_jumps(steps: list[int]) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(min_jumps([2, 4, 1, 1, 0, 3, 1, 2]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します