LeetCode-1749. Suma absoluta máxima de cualquier subarreglo [Medio] -Análisis y código (Java)

LeetCode-1749. Suma absoluta máxima de cualquier subarreglo [Suma absoluta máxima de cualquier subarreglo] [Medio] -Análisis y código [Java]

1. Tema

Le da una matriz de números enteros. El valor absoluto de la suma de una submatriz [numsl, numsl + 1,…, numsr-1, numsr] es abs (numsl + numsl + 1 +… + numsr-1 + numsr).
Busque cualquier submatriz (puede estar vacía) con el mayor valor absoluto de nums y devuelva el valor máximo.
abs (x) se define de la siguiente manera:

  • Si x es un número entero negativo, entonces abs (x) = -x.
  • Si x es un número entero no negativo, entonces abs (x) = x.

Ejemplo 1:

输入:nums = [1,-3,2,3,-4]
输出:5
解释:子数组 [2,3] 和的绝对值最大,为 abs(2+3) = abs(5) = 5 。

Ejemplo 2:

输入:nums = [2,-5,1,-4,3,-2]
输出:8
解释:子数组 [-5,1,-4] 和的绝对值最大,为 abs(-5+1-4) = abs(-8) = 8 。

inmediato:

  • 1 <= núm. De longitud <= 10 ^ 5
  • -10 ^ 4 <= números [i] <= 10 ^ 4

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/maximum-absolute-sum-of-any-subarray 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. Solución de clasificación

(1) Pensando

Debido a que el valor absoluto más grande puede ser el número positivo más grande o el número negativo más pequeño, para evitar varios juicios durante el proceso de recorrido directo, se puede dividir directamente en dos casos: buscar el número positivo más grande y el número negativo más pequeño del Luego, genere el valor absoluto máximo de los dos.

(2) Código

class Solution {
    
    
    public int maxAbsoluteSum(int[] nums) {
    
    
        int sumMax = 0, sum = 0, len = nums.length;
        //正数最大
        for (int i = 0; i < len; i++) {
    
    
            if (sum + nums[i] > 0) {
    
    
                sum += nums[i];
                sumMax = Math.max(sum, sumMax);
            } else
                sum = 0;
        }
        //负数最大
        sum = 0;
        for (int i = 0; i < len; i++) {
    
    
            if (sum - nums[i] > 0) {
    
    
                sum -= nums[i];
                sumMax = Math.max(sum, sumMax);
            } else
                sum = 0;
        }
        return sumMax;
    }
}

(3) Resultados

Tiempo de ejecución: 3 ms, superando al 97,82% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 47,2 MB, superando al 54,25% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

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