Me encuentro con un problema para que se le cae dos elementos en una matriz para que la suma de las tres partes iguales.
Ex:
1 2 4 3 5 2 1
After I drop the 4 and 5, it becomes 1, 2 | 3 | 2, 1
limitaciones:
1.Numbers are all integer > 0
2.Drop two elements in the array, so the three splitted subarrays will have same subarray sum.
Lo he probado usando dos algoritmo pase como el siguiente
Primer paso: O (n) Contar la suma acumulada desde la izquierda para que pueda obtener la suma gama fácilmente.
Segundo paso: O (n ^ 2) Uso de bucle anidado para obtener el índice de inicio y fin de la submatriz. A continuación, se calcula la izquierda, media, suma correcta.
// 1.get accumulated sum map
int[] sumMap = new int[A.length];
int sum = 0;
for(int i = 0; i < A.length; i ++) {
sum += A[i];
sumMap[i] = sum;
}
// 2.try each combination
for(int i = 1; i < A.length - 1; i ++) {
for(int j = i + 1; j < A.length - 1; j ++) {
int left = sumMap[i] - A[i];
int mid = sumMap[j] - sumMap[i] - A[j];
int right = sumMap[A.length - 1] - sumMap[j];
if(left == mid && mid == right)return true;
}
}
¿Hay algo mejor algoritmo que puede alcanzar O (n)?
Gracias
Suponiendo que el primer y último elemento no se puede quitar y todos los elementos son >0
:
Establecer una variable sumleft
de valor del primer elemento, sumright
al valor del último elemento. También es necesario variables índice de recordar qué elementos de izquierda y derecha que ya se han añadido a las sumas.
Si
sumleft == sumright
, si prueba siguientes elementos de izquierda y derecha se puede quitar para satisfacer los requerimientos. Si es así -> hecho. Si no tome siguientes elementos de izquierda y derecha y añadirlo a la variable de suma respectiva. Respaldar a 1.Si
sumleft < sumright
, añadir valor al lado de la izquierda asumleft
. Respaldar a 1.- Si
sumleft > sumright
, añadir valor al lado de la derecha asumright
. Respaldar a 1.
Si se consumieron todos los elementos, no hay solución.