[Implementación de algoritmo-Java] Encuentre la suma acumulativa máxima de submatrices consecutivas
1. Descripción del problema:
1. Entrada: introduzca una cadena de caracteres, que es un conjunto de datos, y cada dato está separado por ",". (Es decir, ingrese una cadena de tipo String y convierta la cadena en una matriz de tipo String mediante el método split () de la clase String).
2. Salida: muestra la suma acumulativa máxima de las submatrices de esta matriz.
2. Respuesta a la pregunta:
1. Si la matriz está vacía o la longitud de la matriz es 0, devuelva 0 directamente.
2. Si los datos de la matriz de entrada no tienen un número positivo, como {-6, -2, -3, -5}, la suma acumulativa máxima es el valor máximo de la matriz, es decir, -2.
2. Idea: Inicializar max = Integer.MIN_VALUE (de modo que el valor del primer elemento de la matriz se establezca en la suma acumulativa máxima actual al llamar a Math.max ()), atravesar la matriz a su vez y usar current para registrar la suma acumulativa máxima de la matriz actual. Cuando la corriente <0, establezca la corriente en 0; cuando la corriente> 0, significa que cada acumulación puede ser la suma de acumulación máxima. Entre ellos, cada vez que se atraviesa la matriz, max se usa para el seguimiento y el método Math.max () se usa para obtener el valor máximo de current y max, y luego max se devuelve al final del ciclo.
3. Análisis de algoritmos:
1. La complejidad del tiempo es O (N) y la complejidad del espacio adicional es O (1).
2.Precauciones: Int max = Integer.MIN_VALUE Este paso es muy crítico, si se inicializa a 0, se producirán problemas. Por ejemplo, cuando la entrada son todos números negativos {-6, -2, -3, -5} (igual que arriba), devolverá 0 en lugar de -2.
En el JDK, los tipos enteros tienen un rango de -2147483648 a 2147483647 (-2 ^ 31-2 ^ 31-1).
El valor máximo es Integer.MAX_VALUE, que es 2147483647, y el valor mínimo es Integer.MIN_VALUE, que es -2147483648.
el código se muestra a continuación
import java.util.*;
public class Solution {
/**
* 求连续子数组的最大和
* @param array string字符串一维数组 数组
* @return int整型
*/
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String str=in.nextLine();
String[] array=str.split(",");
int result=findGreatestSumOfSubArray (array);
System.out.println(result);
}
public static int findGreatestSumOfSubArray (String[] array) {
//数组为空或数组的长度为0
if(array==null||array.length==0) {
return 0;
}
int max=Integer.MIN_VALUE;
int current=0;
for(int i=0;i<array.length;i++) {
current+=Integer.valueOf(array[i].toString());
max=Math.max(max, current);
current=current<0?0:current;
}
return max;
}
}