Una pregunta de la entrevista:Cambie los elementos de dos secuencias, de modo que la diferencia de las sumas de elementos sea mínima.
Dadas dos secuencias de enteros no ordenados
a
yb
, su tamaño es n, todos los números se eligen al azar: intercambiar los elementos dea
yb
, tales que la suma de los elementos dea
menos la suma de los elementos deb
es mínimo.
Dado el ejemplo:
a = [ 5 1 3 ]
b = [ 2 4 9 ]
El resultado es (1 + 2 + 3) - (4 + 5 + 9) = -12.
Mi algoritmo: ordénelos y luego coloque los primeros n
en a
y déjelos en b
. Es O (n lg n) en el tiempo y O (n) en el espacio. No sé cómo mejorarlo con un algoritmo con O (n) en el tiempo y O (1) en el espacio. O (1) significa que no necesitamos más espacio extra excepto las secciones 1 y 2.
¿Alguna idea?
Una pregunta alternativa sería: ¿Qué pasa si tenemos que minimizar el valor absoluto de las diferencias (minimizar |sum(a) - sum(b)|
)?
Se prefiere un pensamiento python o C++.
suena como una tarea. Si es así, por favor marque en consecuencia. – celtschk
No puede ser O (1) en el espacio si considera las listas originales a y b. Si no los considera, simplemente cambie los valores directamente. En cualquier caso, proporcione más detalles en la pregunta. – GaretJax
@GaretJax, ¿Cómo intercambiar de manera eficiente con el tiempo de O (n)? – user1002288