Sword se refiere a la oferta 51. Pares invertidos en un análisis de matriz y código [Java]
1. Título
Para dos números de la matriz, si el primer número es mayor que el siguiente, los dos números forman un par inverso. Ingrese una matriz, encuentre el número total P de pares inversos en esta matriz y envíe el resultado de P módulo 1000000007. Es decir, se emite P% 1000000007. .
Descripción de entrada: el
título garantiza el mismo número que no está en la matriz de entrada
rango de datos:
- Para datos de% 50, tamaño <= 10 ^ 4
- Para datos de% 75, tamaño <= 10 ^ 5
- Para datos de% 100, tamaño <= 2 * 10 ^ 5
Ejemplo 1:
entrada
1,2,3,4,5,6,7,0
Salida
7
Dos, análisis y código
1. Combinar ordenación
(1) Pensando
Esta pregunta se puede resolver combinando la idea de fusionar y ordenar: en cada proceso de fusión, (asumiendo la clasificación de pequeño a grande), cuando el número mayor cruza el dígito posterior más pequeño desde el anverso a una nueva posición, el el número de dígitos más pequeños excedido es el orden inverso El número de pares.
Combinado con el mensaje de pregunta, el resultado de esta pregunta puede ser de mayor magnitud, lo que puede resolverse realizando una operación de módulo después de cada acumulación.
(2) Código
public class Solution {
public int InversePairs(int [] array) {
if (array == null || array.length == 0)
return 0;
return Sort(array, 0, array.length);
}
public int Sort(int[] array, int left, int right) {
if (right - left < 2)
return 0;
int mid = (left + right) >> 1;
int num = 0;
num += Sort(array, left, mid);
num += Sort(array, mid, right);
int [] tempArray = new int[right - left];
int l = left, r = mid;
for (int i = left; i < right; i++) {
if (r == right || (l < mid && array[l] < array[r])) {
tempArray[i - left] = array[l++];
} else {
tempArray[i - left] = array[r++];
num += mid - l;
num %= 1000000007;
}
}
for (int i = left; i < right; i++)
array[i] = tempArray[i - left];
return num;
}
}
(3) Resultados
Tiempo de ejecución: 464 ms, memoria ocupada: 50408 k.
Tres, otro
Nada.