LeetCode-1631. Ruta con código y análisis de esfuerzo mínimo (Java)

LeetCode-1631. Ruta con mínimo esfuerzo [Ruta con mínimo esfuerzo] -Análisis y código [Java]

1. Tema

Vas a participar en una caminata. Le da un mapa bidimensional de alturas de filas x columnas, donde alturas [fila] [col] representa la altura de la cuadrícula (fila, columna). Al principio, se encuentra en la esquina superior izquierda (0, 0) y desea ir a la esquina inferior derecha (filas-1, columnas-1) (tenga en cuenta que los subíndices están numerados desde 0). Puede moverse hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha en una de las cuatro direcciones cada vez. Desea encontrar el camino que consume la menor cantidad de energía.
La energía física consumida por un camino está determinada por el valor absoluto máximo de la diferencia de altura entre cuadrículas adyacentes en el camino.
Devuelva el valor de esfuerzo físico mínimo de la esquina superior izquierda a la esquina inferior derecha.

Ejemplo 1:

输入:heights = [[1,2,2],[3,8,2],[5,3,5]]
输出:2
解释:路径 [1,3,5,3,5] 连续格子的差值绝对值最大为 2 。
这条路径比路径 [1,2,2,2,5] 更优,因为另一条路径差值最大值为 3 。

Ejemplo 2:

输入:heights = [[1,2,3],[3,8,4],[5,3,5]]
输出:1
解释:路径 [1,2,3,4,5] 的相邻格子差值绝对值最大为 1 ,比路径 [1,3,5,3,5] 更优。

Ejemplo 3:

输入:heights = [[1,2,1,1,1],[1,2,1,2,1],[1,2,1,2,1],[1,2,1,2,1],[1,1,1,2,1]]
输出:0
解释:上图所示路径不需要消耗任何体力。

inmediato:

  • filas == alturas.longitud
  • columnas == alturas [i] .longitud
  • 1 <= filas, columnas <= 100
  • 1 <= alturas [i] [j] <= 106

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/path-with-minimum-effort Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Combinar

(1) Pensando

El esfuerzo físico en esta pregunta está determinado por la diferencia de altura máxima, y ​​cada vez puede subir, bajar, izquierda y derecha en cualquier dirección, por lo que no es adecuado para ser resuelto mediante programación dinámica.
La celosía se puede abstraer como un nodo y la ruta se puede abstraer como un borde, que se puede transformar en un problema de conexión del gráfico. Agregue bordes con diferencias de altura más pequeñas uno por uno y registre la conectividad entre nodos con un conjunto de verificación de unión.Cuando el punto de inicio y el punto final están conectados, la diferencia de altura del borde agregado actualmente es la respuesta.

(2) Código

class Solution {
    
    
    public int minimumEffortPath(int[][] heights) {
    
    
        int row = heights.length, col = heights[0].length, len = row * col;
        List<int[]> edges = new ArrayList<int[]>();//存储边,[0]、[1]为节点1、2,[2]为高度差绝对值
        for (int i = 0; i < row; i++) {
    
    
            for (int j = 0; j < col; j++) {
    
    
                int id = i * col + j;
                if (i > 0)//存储向上的边
                    edges.add(new int[]{
    
    id - col, id, Math.abs(heights[i - 1][j] - heights[i][j])});
                if (j > 0)//存储向左的边
                    edges.add(new int[]{
    
    id - 1, id, Math.abs(heights[i][j - 1] - heights[i][j])});
            }
        }
        Collections.sort(edges, new Comparator<int[]>() {
    
    
            public int compare(int[] e1, int[] e2) {
    
    
                return e1[2] - e2[2];
            }
        });

        int [] parent = new int[len];//格子的并查集
        for (int i = 0; i < len; i++)
            parent[i] = i;
        for (int i = 0; i < edges.size();) {
    
    
            int i0 = i;
            while (i < edges.size() && edges.get(i0)[2] == edges.get(i)[2])//添加所有当前高度差的边
                union(parent, edges.get(i)[0], edges.get(i++)[1]);
            if (find(parent, 0) == find(parent, len - 1))
                return edges.get(i0)[2];
        }
        return 0;
    }

    public int find(int[] parent, int i) {
    
    
        if (parent[i] != i)
            parent[i] = find(parent, parent[i]);
        return parent[i];
    }

    public void union(int[] parent, int p1, int p2) {
    
    
        parent[find(parent, p2)] = find(parent, p1);
    }
}

(3) Resultados

Tiempo de ejecución: 98 ms, superando al 57,25% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 39,6 MB, superando al 21,47% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/113797834
Recomendado
Clasificación