Oferta de Sword Finger: 51. Pares invertidos en matriz: análisis y código (Java)

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.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/110410206
Recomendado
Clasificación