タイトル
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