[Una pregunta del día] Force 1046. El peso de la última piedra

Descripción del título ( portal )

Hay un montón de piedras y el peso de cada piedra es un número entero positivo.

En cada ronda, elija las dos piedras más pesadas de ellas y luego rómpalas. Suponga que el peso de la piedra es xey, y x <= y. Los posibles resultados de la trituración son los siguientes:

Si x == y, entonces ambas piedras se triturarán por completo;
si x! = Y, entonces la piedra de peso x se triturará por completo, y el nuevo peso de la piedra de peso y es yx.
Al final, como mucho solo quedará una piedra. Devuelve el peso de esta piedra. Si no quedan piedras, devuelve 0.

Ejemplo:

输入:[2,7,4,1,8,1]
输出:1
解释:
先选出 78,得到 1,所以数组转换为 [2,4,1,1,1],
再选出 24,得到 2,所以数组转换为 [2,1,1,1],
接着是 21,得到 1,所以数组转换为 [1,1,1],
最后选出 11,得到 0,最终数组转换为 [1],这就是最后剩下那块石头的重量。

Ideas para resolver problemas

Método 1: ordenar la violencia

Ordene la matriz de piedras, luego reste las dos más grandes, actualice la diferencia al subíndice len-1 y actualice la otra a 0. Ordene la matriz. .
Sigue girando así, después de cada clasificación, se garantiza que se restan los dos valores máximos, y el bucle termina, y el valor máximo restante es el peso de la última piedra restante.

public int lastStoneWeight(int[] stones) {
    
    
        Arrays.sort(stones);
        int len = stones.length;
        while (len-- >=0) {
    
    
            stones[stones.length-1] = stones[stones.length-1] - stones[stones.length - 2];
            stones[stones.length-2] = 0;
            Arrays.sort(stones);
        }
        return stones[stones.length - 1];
    }

Método 2: pila superior grande

Análisis en profundidad de PriorityQueue

Use la cola de prioridad PriorityQueue para lograr una pila grande, el uso relacionado se puede ver API y código fuente.
Método de construcción:
Inserte la descripción de la imagen aquí
método de interfaz:
Inserte la descripción de la imagen aquí

public int lastStoneWeight(int[] stones) {
    
    
         PriorityQueue<Integer> priorityQueue = new PriorityQueue<Integer>((a, b) -> b - a);
         /**
			 * 重写compare方法。
			 * 在此体现了所谓的"自定义":即根据自己所写逻辑来决定实现最大/小堆
			 */
		// a-b  则是小根堆
        for (int stone : stones
                ) {
    
    
            priorityQueue.offer(stone);
        }

        
        while (priorityQueue.size() > 1) {
    
    
            int a = priorityQueue.poll();
            int b = priorityQueue.poll();
            if (a - b > 0) {
    
    
                priorityQueue.offer(a - b);
            }
        }
        return priorityQueue.isEmpty()?0:priorityQueue.poll();
    }

Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111941582
Recomendado
Clasificación