Antiguo Wei gana la oferta que le llevará a conocer --- Título de la serie cepillo (en orden inverso a 35. La matriz)

35. La matriz de la inversa

problema:

Dos números de la matriz, si un número es mayor que el frente detrás de las figuras, los dos números forman un par inverso. Ingrese una matriz, esta matriz P. encuentra el número total de par inversa P y envía el módulo resultado 1000000007. Es decir, la salida P% 1000000007

solución:

pensado:

Ver este tema, nuestra primera reacción es una exploración secuencial de toda la matriz. Cada vez que una matriz para escanear, uno comparando el número y el tamaño de lo digital detrás de él. Si la última cifra es menor que lo es, entonces las dos figuras sobre la formación de un par inverso. Supongamos que la matriz contiene n dígitos. Puesto que cada digital y debe ser O (n) comparar este número, la complejidad de tiempo del algoritmo es O (n ^ 2).
Tenemos un conjunto {7,5,6,4} como un ejemplo para el análisis estadístico de la inversa. Cada escaneo a una digital, no conseguimos ta y cada respaldo digital para la comparación, de lo contrario la complejidad del tiempo es O (n ^ 2), por lo que podemos considerar comparar dos números adyacentes.
Aquí Insertar imagen Descripción
(A) la longitud de la matriz 4 en dos sub-matrices de longitud 2;
(B) el sub-matriz de una matriz de longitud 2 en dos Chengdu 1;
(C) la longitud de la sub-serie 1 se combinaron, clasificación y recuento de inverso;
(D) de la longitud del subconjunto 2 combinado de clasificación, y el recuento en el reverso;
. en la figura (a) y (b), primero se descompone en dos matrices de longitud 2 sub-matriz, entonces las dos sub-series se divide en dos sub-series de longitud 1. A continuación, mientras la fusión adyacentes sub-series, mientras que las estadísticas sobre el número de reversa. En la primera longitud sub-array 7 {1}, {5} es mayor que 7, 5, por lo que (7,5) para formar un par inverso. También en la segunda longitud sub-array 1 {6}, {4} es también un orden inverso (6,4). Puesto que tenemos dos pares de orden interno inversa estadísticas array, es necesario ordenar la matriz dos sub muestra arriba (c), a fin de evitar repetido en proceso estadístico estadístico posterior.
A continuación, invertir la longitud estadística entre dos sub-sub-array 2 array. El proceso combinado de la submatriz y la siguiente inversa estadística como se muestra en la figura.
Fuimos los primeros con dos punteros al final de las dos sub-series, y comparar las dos cifras cada puntero. Si el número de la primera sub-serie número mayor que la segunda matriz, la configuración inversa del número igual al número de la marcha atrás y una segunda sub-matriz en los dígitos restantes, como se muestra a continuación (a) y (c), espectáculos. Si el primer número es menor que o igual a la matriz en la segunda matriz no constituye un orden inverso, como se muestra en la figura b. Cada comparaciones en el tiempo, que consideran el mayor número copiado de la parte de atrás hacia adelante a una matriz auxiliar, asegúrese de que la matriz auxiliar (referido como copia) El número en orden ascendente. Después de la gran copia digital a la matriz secundaria, que corresponde al movimiento de avance de un puntero, a continuación, la siguiente ronda de comparación.
Aquí Insertar imagen Descripción

código Python:

# -*- coding:utf-8 -*-
import copy
class Solution:
    def InversePairs(self, data):
        return self.sort(data[:], 0, len(data)-1, data[:]) % 1000000007

    def sort(self, temp, left, right, data):
        ### 先考虑每个分组只有一个元素的时候
        if right - left < 1:
            return 0
        if right - left == 1:
            if data[left] < data[right]:
                return 0
            else:
                temp[left], temp[right] = data[right], data[left]
                return 1
        #### 分组
        mid = (left + right) // 2
        res = self.sort(data, left, mid, temp) + self.sort(data, mid+1, right, temp)
		# 合并分组
        i = left
        j = mid + 1
        index = left

        while i <= mid and j <= right:
            if data[i] <= data[j]:
                temp[index] = data[i]
                i += 1
            else:
                temp[index] = data[j]
                res += mid +1-i
                j += 1
            index += 1
        while i <= mid:
            temp[index] = data[i]
            i += 1
            index += 1
        while j <= right:
            temp[index] = data[j]
            j += 1
            index += 1
        return res



Publicados 160 artículos originales · elogios ganado 30 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/yixieling4397/article/details/105022755
Recomendado
Clasificación