Caída de dos elementos para dividir la matriz a tres partes de manera uniforme en O (n)

Jason:

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

Michael Butscher:

Suponiendo que el primer y último elemento no se puede quitar y todos los elementos son >0:

Establecer una variable sumleftde valor del primer elemento, sumrightal 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.

  1. 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.

  2. Si sumleft < sumright, añadir valor al lado de la izquierda a sumleft. Respaldar a 1.

  3. Si sumleft > sumright, añadir valor al lado de la derecha a sumright. Respaldar a 1.

Si se consumieron todos los elementos, no hay solución.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=166208&siteId=1
Recomendado
Clasificación