Enlace del directorio:
Problemas de programación de Lituo - Resumen de soluciones_Compartir+Registros-CSDN Blog
Proyecto de cepillado síncrono de GitHub:
https://github.com/September26/java-algorithms
Enlace al título original: Likou
describir:
Dada una matriz en anillo de enterosn
de longitud , devuelva la mayor suma posible de subarreglos no vacíos . nums
nums
Una matriz circular significa que el final de la matriz estará conectado al principio en un anillo. Formalmente, nums[i]
el siguiente elemento de es nums[(i + 1) % n]
, nums[i]
y el elemento anterior es nums[(i - 1 + n) % n]
.
Un subarreglo puede contener nums
cada elemento en el búfer fijado como máximo una vez. Formalmente, para los subarreglos nums[i], nums[i + 1], ..., nums[j]
, no existe ninguno i <= k1, k2 <= j
dentro de k1 % n == k2 % n
.
Ejemplo 1:
Entrada: nums = [1,-2,3,-2] Salida: 3 Explicación: Obtenga la suma máxima 3 del subarreglo [3]
Ejemplo 2:
Entrada: nums = [5,-3,5] Salida: 10 Explicación: Obtenga la suma máxima del subarreglo [5,5] 5 + 5 = 10
Ejemplo 3:
Entrada: nums = [3,-2,2,-3] Salida: 3 Explicación: La suma máxima de 3 se puede obtener de los subarreglos [3] y [3,-2,2]
pista:
n == nums.length
1 <= n <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
Ideas para resolver problemas:
* Ideas para resolver problemas: * Primero, duplicamos la longitud de nums y encontramos el prefijo sum. * De esta manera, esta pregunta se convierte en una cuestión de encontrar el valor máximo de i>j, i<=j+n, prefijos[i]-prefijos[j] en la matriz 2n. * Primero, encuentra el prefijo sum, correspondiente al método maxSubarraySumCircular, y encuentra el valor máximo de prefixs[i]-prefixs[j] correspondiente al método findBixDiff. * En el método findBixDiff, construya una cola monótona, que se divide en tres escenarios: * 1. Si la longitud de ij es mayor que n, entonces j debe eliminarse. * 2. Si prefijos[i]-prefijos[j]>abs, actualice abs. *3. Si prefixs[i]<=prefixs[k], la posición de k en la cola pierde significado, porque la posición de i es posterior y el valor es menor, lo que es más ventajoso que k, por lo que k se quita de la cola* y finalmente vuelve a los abdominales.
código:
public class Solution918 {
// -2,1,-3,4,-1,2,1,-5,4
public int maxSubarraySumCircular(int[] nums) {
int n = nums.length;
List<Integer> prefixs = new ArrayList<>();
prefixs.add(0);
int pre = prefixs.get(0);
for (int i = 0; i < n * 2; i++) {
pre += nums[i % n];
prefixs.add(pre);
}
return findBixDiff(prefixs, n);
}
public int findBixDiff(List<Integer> list, int size) {
int abs = Integer.MIN_VALUE;
Deque<Pair<Integer, Integer>> deque = new ArrayDeque<>();
deque.push(new Pair<>(0, list.get(0)));
for (int i = 1; i < list.size(); i++) {
if (!deque.isEmpty() && i - deque.peekFirst().getKey() > size) {
deque.pollFirst();
}
Integer integer = list.get(i);
abs = Math.max(integer - deque.peekFirst().getValue(), abs);
while (!deque.isEmpty() && deque.peekLast().getValue() >= integer) {
deque.pollLast();
}
deque.offerLast(new Pair<>(i, integer));
}
return abs;
}
}