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