Resumen de la solución LeetCode 918. Suma máxima de subarreglos circulares

 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;
    }

}

Supongo que te gusta

Origin blog.csdn.net/AA5279AA/article/details/131856137
Recomendado
Clasificación