[LeetCode en Python] 1345 (H) juego de salto iv Juego de salto iv

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

Supongo que te gusta

Origin www.cnblogs.com/journeyonmyway/p/12729724.html
Recomendado
Clasificación