Titulo
https://leetcode-cn.com/problems/jump-game-iv/solution/
Se le da una matriz de enteros arr, comienza en el primer elemento de la matriz (el subíndice es 0).
En cada paso, puede saltar del subíndice i al subíndice:
i + 1 satisface: i + 1 <longitud de arr.
i-1 satisface: i-1> = 0
j satisface: arr [i] == arr [j] e i! = j
por favor regrese al último elemento de la matriz El número mínimo de operaciones requeridas en el subíndice.
Nota: No puede saltar fuera de la matriz en ningún momento.
Ejemplo 1:
Entrada: arr = [100, -23, -23,404,100,23,23,23,3,404]
Salida: 3
Explicación: Entonces necesitas saltar 3 veces, los subíndices son 0-> 4-> 3-> 9 . El subíndice 9 es el subíndice del último elemento de la matriz.
Ejemplo 2
Entrada: arr = [7]
Salida: 0
Explicación: Está en el último elemento al principio, por lo que no necesita saltar.
Ejemplo 3
Entrada: arr = [7,6,9,6,9,6,9,7]
Salida: 1
Explicación: Puede saltar directamente del subíndice 0 al subíndice 7, que es el último elemento de la matriz.
Ejemplo 4
Entrada: arr = [6,1,9]
Salida: 2
Ejemplo 5:
Entrada: arr = [11,22,7,7,7,7,7,7,7,22,13]
Salida: 3
Consejos:
1 <= longitud de arr <<5 * 10 ^ 4
-10 ^ 8 <= arr [i] <= 10 ^ 8
Ideas para resolver problemas
- Primero use un diccionario para almacenar valores de matriz y listas de subíndices
- Para caracteres consecutivos, como "77 ... 77", solo grabe el primero y el último, omita el medio, de lo contrario TLE
- El resto es el proceso estándar de BFS
Código
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