Le titre
https://leetcode-cn.com/problems/jump-game-iv/solution/
On vous donne un tableau d'entiers arr, vous commencez au premier élément du tableau (l'indice est 0).
À chaque étape, vous pouvez passer de l'indice i à l'indice:
i + 1 satisfait: i + 1 <longueur d'arrivée
i-1 satisfait: i-1> = 0
j satisfait: arr [i] == arr [j] et i! = j
veuillez revenir au dernier élément du tableau Le nombre minimum d'opérations requises à l'indice.
Remarque: Vous ne pouvez à aucun moment sortir du tableau.
Exemple 1:
Entrée: arr = [100, -23, -23,404,100,23,23,23,3,404]
Sortie: 3
Explication: Ensuite, vous devez sauter 3 fois, les indices sont 0-> 4-> 3-> 9 . L'indice 9 est l'indice du dernier élément du tableau.
Exemple 2:
Entrée: arr = [7]
Sortie: 0
Explication: C'est au dernier élément au début, donc vous n'avez pas besoin de sauter.
Exemple 3:
Entrée: arr = [7,6,9,6,9,6,9,7]
Sortie: 1
Explication: Vous pouvez passer directement de l'indice 0 à l'indice 7, qui est le dernier élément du tableau.
Exemple 4:
Entrée: arr = [6,1,9]
Sortie: 2
Exemple 5:
Entrée: arr = [11,22,7,7,7,7,7,7,7,22,13]
Sortie: 3
Astuces:
1 <= longueur d'arrivée <= 5 * 10 ^ 4
-10 ^ 8 <= arr [i] <= 10 ^ 8
Idées de résolution de problèmes
- Utilisez d'abord un dictionnaire pour stocker les valeurs des tableaux et les listes d'indices
- Pour les caractères consécutifs, tels que "77 ... 77", enregistrez uniquement le premier et le dernier, sautez le milieu, sinon TLE
- Le reste est le processus BFS standard
Code
class Solution:
def minJumps(self, arr: List[int]) -> int:
g = defaultdict(list)
for i,a in enumerate(arr):
# - key optimization
# - skip continous value, such as '77...77', only keep first and last 7
if (i > 0) and (i < len(arr) - 1) and (a == arr[i-1] == arr[i+1]):
continue
g[a].append(i)
seen_set = set([0])
q = [(0,0)]
step = 0
while q:
p, step = q.pop(0)
# - check if touch the end
if p == len(arr) - 1:
return step
for k in [p-1, p+1] + g[arr[p]]:
if k in seen_set: continue
if 0 <= k <= len(arr)-1:
seen_set.add(k)
q.append((k, step+1))
return 0