Leetcodeブラッシングレコード-55。ジャンプゲーム

ここに画像の説明を挿入

この質問は最初は理解できなかったので、質問の要件を繰り返し述べてください。

リストがnumsの場合、0番目の要素から
ジャンプします。最初にジャンプできる最長距離はnums [0]です。
つまり
最初のステップで{1,2、...にジャンプすることを選択できます。 、nums [0]}、
次に、aにジャンプしたと仮定して、ジャンプを続けることができます。
オプションのジャンプ範囲は{a + 1、…、a + nums [a]}
最後までジャンプするまでこのようにジャンプします、
これが最後にジャンプできる場合はtrueを返し、それ以外の場合はfalseを返します

アイデアを整理します。これは貪欲なアルゴリズムで解決できます。
各ジャンプの後で最も遠い場所にジャンプしたい
ので、最初に各位置
からジャンプできる最も遠い位置計算します。要素の意味は、ここからジャンプできる最も遠い距離で
あり、nums [i]から到達できる最も遠い位置は、i + nums [i]として表すことができます。
したがって、最初に
nums = の各要素についてnums = を計算します[i + nums [i] for i、enumerate(nums)の値] nums
のi番目の要素の意味は、i番目の位置から
ジャンプすると、最も遠い位置にジャンプできるということです。
ジャンプ戦略は
nums [0]から始めて、毎回
到達できる最も遠い位置にジャンプします。たとえば、nums = [3,2,1,0,4]の場合、計算後、nums = [3,3,3,3,8]
その後、我々は3,0、2第1の位置から移動することができ
NUMS [1]、NUMS [2-する:我々はNUMS [4 1]選択した ]、NUMS [3] の最大の
最後までジャンプになっているが
最後の位置にジャンプする:True
またはある位置で止まっている(つまり、到達可能なtempmax位置がまだ最後に到達しておらず、この値は2回連続してジャンプした後も変化しない):False

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        length = len(nums)
        nums = [nums[i] + i for i in range(length)]
        start = 0
        last = 0
        this = 0
        while this < length - 1:#还没到
            if start == 1 and this == last:
                return False
            elif start == 0:
                start = 1
            end = nums[this]
            if end >= length - 1:
                return True
            templist = nums[last:end+1]#last+1
            tempmax = max(templist)
            last = this
            this = tempmax 
            print(last,this)
            if this == end and this < length - 1:
                return False
        return True
43件の元の記事を公開 14 件を賞賛・2 万回以上の閲覧

おすすめ

転載: blog.csdn.net/weixin_41545780/article/details/105320284