【PythonのLeetCode】45(H)ジャンプゲームiiジャンプゲームII

タイトル

https://leetcode-cn.com/problems/jump-game-ii/

負でない整数の配列を指定すると、最初は配列の最初の位置にいます。
配列の各要素は、その位置でジャンプできる最大の長さを表します。
あなたの目標は、最小限のジャンプで配列の最後の位置に到達することです。

例:

入力:[2,3,1,1,4]
出力:2
説明:最後の位置へのジャンプの最小数は2です。
  インデックス0からインデックス1の位置にジャンプし、1ステップジャンプしてから、3ステップジャンプして配列の最後の位置に到達します。

説明:

常に配列の最後の位置に到達できると仮定します。

問題解決のアイデア

    index   0 1 2 3 4
    nums    2 3 1 1 4
    step    0 1 1 2 2
    cur_end 0 2 2 4 4
    max_end 2 4 4 4 8
  • 上記の例を見てください
  • stepは、それぞれこの位置に到達するための最小ステップ数を表します[0、1、1、2、2]
  • 次に、上記を3つのセグメントに分割できます。cur_endを使用して、現在のステップ番号の下で右ボーダーの添え字を記録します。
  • トラバースするとき、cur_endを横切るとき、cur_endを現在の最大境界max_endに更新し、ステップ++
  • max_endの更新は、cur_endの更新の後に配置する必要があります
  • コードは少ないですが、実はこの質問は思ったより面倒です...

コード

class Solution:
    def jump(self, nums: List[int]) -> int:

        # - example
        # 
        # index   0 1 2 3 4
        # nums    2 3 1 1 4
        # step    0 1 1 2 2
        # cur_end 0 2 2 4 4
        # max_end 2 4 4 4 8

        step = 0
        cur_end, max_end = 0, 0
        
        for i, n in enumerate(nums):
            # - update cur_end after last cur_end
            if i == cur_end + 1:
                cur_end = max_end
                step += 1

            # - update max_end
            max_end = max(max_end, i+n)
    
        return step

おすすめ

転載: www.cnblogs.com/journeyonmyway/p/12729615.html