[LeetCode en Python] 1345 (H) jeu de saut iv Jeu de saut iv

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

Je suppose que tu aimes

Origine www.cnblogs.com/journeyonmyway/p/12729724.html
conseillé
Classement