[Oferta de dedo de espada] _12 Par inverso en la matriz

Descripción del título

Los dos números en la matriz, si el número anterior es mayor que el último número, entonces estos dos números forman un par de orden inverso. Ingrese una matriz para encontrar el número total P de pares en orden inverso en esta matriz. Y muestra el resultado del módulo P a 1000000007. Es decir, salida P% 1000000007

Ideas para resolver problemas

Solución de oferta de dedo espada
Al ver este problema, nuestra primera reacción es escanear todo el conjunto de forma secuencial. Cada vez que se escanea una matriz, el tamaño del número y el número que sigue se comparan uno por uno. Si el siguiente número es más pequeño, estos dos números forman un par inverso. Supongamos que la matriz contiene n números. Como cada número debe compararse con el número O (n), la complejidad temporal de este algoritmo es O (n ^ 2).
Tomemos la matriz {7,5,6,4} como ejemplo para analizar el proceso de pares estadísticos de orden inverso. Cada vez que escaneamos un número, no comparamos ta con cada número subsiguiente, de lo contrario, la complejidad del tiempo es O (n ^ 2), por lo que podemos considerar primero comparar dos números adyacentes.
Inserte la descripción de la imagen aquí
(a) Descomponga una matriz de longitud 4 en dos sub-matrices de longitud 2;
(b) Descomponga una matriz de longitud 2 en dos sub-matrices de Chengdu;
© Combine sub-matrices de longitud 1, Ordene y cuente los pares de orden inverso;
(d) Combine y ordene los subconjuntos de longitud 2 y cuente los pares de orden inverso;
en (a) y (b) anteriores, primero descomponemos el conjunto en dos sublongitudes Matriz, y luego dividir las dos sub-matrices en dos sub-matrices de longitud 1. A continuación, al fusionar subarreglos adyacentes, se cuenta el número de pares en orden inverso. En el primer par de submatrices de longitud 1 {7} y ​​{5}, 7 es mayor que 5, por lo que (7, 5) forman un par de orden inverso. De manera similar, en el segundo par de subconjuntos de longitud 1 {6} y {4}, también hay pares en orden inverso (6, 4). Como ya hemos contado los pares de orden inverso dentro de estos dos subarreglos, necesitamos clasificar los dos pares de subarreglos como se muestra en la Figura (c) anterior, para no repetir las estadísticas en el proceso estadístico futuro.

A continuación, contamos los pares inversos entre dos subconjuntos de longitud 2 del subconjunto. El proceso de fusionar sub-matrices y contar los pares inversos se muestra en la figura a continuación.

Primero usamos dos punteros para señalar el final de las dos sub-matrices, y comparamos los números señalados por los dos punteros cada vez. Si el número en el primer subconjunto es mayor que el número en el segundo conjunto, se forman los pares de orden inverso y el número de pares de orden inverso es igual al número de números restantes en el segundo subconjunto, como se muestra en (a) y (c) a continuación Mostrar Si el número en el primer conjunto es menor o igual que el número en el segundo conjunto, no constituye un par de orden inverso, como se muestra en la Figura b. Cada vez que comparamos, copiamos los números más grandes desde la parte posterior a la matriz auxiliar para asegurarnos de que los números en la matriz auxiliar (denotados como copia) estén ordenados en orden creciente. Después de copiar el número más grande en la matriz auxiliar, mueva el puntero correspondiente un bit hacia adelante y luego realice la siguiente ronda de comparación.
Inserte la descripción de la imagen aquí
Proceso: Primero divida la matriz en sub-matrices, primero cuente el número de pares de orden inverso dentro de la sub-matriz, y luego cuente el número de pares de orden inverso entre dos sub-matrices adyacentes. En el proceso de emparejamiento estadístico de orden inverso, también es necesario ordenar la matriz. Si está familiarizado con el algoritmo de clasificación, no es difícil encontrar que este proceso es realmente una combinación.

Implementación de código

class Solution {
public:
    int InversePairs(vector<int> data) {
       int length=data.size();
        if(length<=0)
            return 0;
       //vector<int> copy=new vector<int>[length];
       vector<int> copy;
       for(int i=0;i<length;i++)
           copy.push_back(data[i]);
       long long count=InversePairsCore(data,copy,0,length-1);
       //delete[]copy;
       return count%1000000007;
    }
    long long InversePairsCore(vector<int> &data,vector<int> &copy,int start,int end)
    {
       if(start==end)
          {
            copy[start]=data[start];
            return 0;
          }
       int length=(end-start)/2;
       long long left=InversePairsCore(copy,data,start,start+length);
       long long right=InversePairsCore(copy,data,start+length+1,end); 
        
       int i=start+length;
       int j=end;
       int indexcopy=end;
       long long count=0;
       while(i>=start&&j>=start+length+1)
          {
             if(data[i]>data[j])
                {
                  copy[indexcopy--]=data[i--];
                  count=count+j-start-length;          //count=count+j-(start+length+1)+1;
                }
             else
                {
                  copy[indexcopy--]=data[j--];
                }          
          }
       for(;i>=start;i--)
           copy[indexcopy--]=data[i];
       for(;j>=start+length+1;j--)
           copy[indexcopy--]=data[j];       
       return left+right+count;
    }
};
Sol
Publicado 253 artículos originales · elogiado 41 · 40,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/liuyuchen282828/article/details/103858021
Recomendado
Clasificación