[PythonのLeetCode] 1306(M)ジャンプゲームiiiジャンプゲームIII

タイトル

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

非負整数の配列arrがあり、配列の先頭にいます。下付き文字iにいるとき、i + arr [i]またはi-arr [i]にジャンプできます。
対応する要素の値が0の添え字にジャンプできるかどうかを判断してください。
どのような状況であっても、配列の外にジャンプすることはできません。

例1:

入力:arr = [4,2,3,0,3,1,2]、start = 5
出力:true

説明:
値が0の
添え字3には、以下の可能な解決策があります:添え字5->添え字4->添え字1->添え字3
添え字5->添え字6->添え字4->添え字1->下付き文字3

例2:

入力:arr = [4,2,3,0,3,1,2]、start = 0
出力:true

説明:
値が0の
添え字3には、以下の可能な解決策があります。添え字0->添え字4->添え字1->添え字3

例3:

入力:arr = [3,0,2,1,2]、start = 2
出力:false

説明:値が0の添え字1に到達できません。

ヒント:

1 <= arr.length <= 5 * 10 ^ 4
0 <= arr [i] <arr.length
0 <= start <arr.length

問題解決のアイデア

  • 標準BFSプロセス
  • seen_set下付き文字にアクセスするには、set storageを使用します
  • 横を横断するときは、訪れたかどうかを判断するだけでなく、左右の境界を越えたかどうかも確認する必要があります

コード

class Solution:
    def canReach(self, arr: List[int], start: int) -> bool:
        seen_set = set([start])
        q = [start]
        while q:
            p = q.pop(0)
            if arr[p] == 0:
                return True

            for k in [p-arr[p], p+arr[p]]:
                if k in seen_set: continue
                
                if 0 <= k <= len(arr)-1:
                    q.append(k)
                    seen_set.add(k)
        
        return False

おすすめ

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