Un ejercicio diario para encontrar la mediana de la fusión de dos matrices ordenadas

Combinar la mediana de dos matrices ordenadas

Dirección OJ:
fusionar la mediana de dos matrices ordenadasInserte la descripción de la imagen aquí

Debido a que requiere O (log (m + n)), usamos dos puntos para la primera respuesta, pero ¿cómo usar dos puntos?
Las matrices A y B se ordenan por separado. Primero podemos encontrar una línea divisoria i en la matriz A, de modo que la matriz A se divide en dos partes: A_left y A_right. Luego, debido a que necesitamos encontrar la mediana, podemos calcular directamente la matriz B Una línea divisoria j hace que el tamaño (Aleft) + el tamaño (Bleft) = el tamaño (Aright) + el tamaño (Bright), pero aún no ha terminado, porque max (aleft, bleft) <min (right, bright) debe satisfacerse , Por lo tanto, necesitamos ajustar el valor de i (dos puntos) en este momento, y luego calcular directamente el valor de j hasta el valor de i, y luego realizar un ciclo hasta que se cumpla la condición. Sea n el tamaño de la matriz a, i es el punto de división y b El tamaño de la matriz es my j es el punto de división. La condición general es:

i + j = n + mij cuando n + m es par o i + j = n + m + 1-ij cuando n + m es impar -> j = (n + m + 1) / 2-i m> = n. . . Porque si n> m, j puede ser menor que 0
a [i-1] <b [j] y a [i]> b [j-1]
1
2
Para i, j = 0 e i = n, j = m Las condiciones de contorno necesitan un tratamiento especial y es relativamente simple. Por
ejemplo, cuando i = 0, o j = m, no es necesario marcar a [i-1] <b [j], solo marcar a [i]> b [j -1]

i> 0, m> = norte -> j = (n + m + 1) / 2-i <(m + n + 1) / 2 <= (2m + 1) / 2metro
yo <n, metro> = norte -> j = (norte + metro + 1) / 2-yo> = (2n + 1) / 2-yo> (2n + 1) / 2-n
0
1
2
El procesamiento del bucle es simple:
1. Cuando i> 0 y a [i-1]> b [j] -> i es demasiado grande
2. Cuando i <ny a [i] <b [j- 1] -> i es demasiado pequeño
3. De lo contrario, i está en la posición correcta

el código se muestra a continuación:

class Solution {
    
    
public:
	double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    
    
		if(nums2.size()<nums1.size())
		{
    
    
            return findMedianSortedArrays(nums2,nums1);
        }  
        int n=nums1.size(),m=nums2.size();
        int left = 0,right = n;
        double max_left=-1,min_right=-1;
        while(true)
        {
    
    
            int i = (right+left)/2;
            int j = (m+n+1)/2-i;
            if(i<n && nums1[i] < nums2[j-1]) //i is small
            {
    
    
                left=i+1;
            }
            else if(i>0 && nums1[i-1] > nums2[j] )// i is big
            {
    
    
                right = i-1;
            }
            else
            {
    
    
				if(i==0)max_left=nums2[j-1];
                else if(j==0)max_left=nums1[i-1];
                else max_left=max(nums1[i-1],nums2[j-1]);
                if((n+m)%2)return max_left;
                if(i==n)min_right=nums2[j];
                else if(j==m)min_right=nums1[i];
                else min_right=min(nums1[i],nums2[j]);
                return (min_right+max_left)/2;
            }
        }
        return -1;
    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_41033011/article/details/108820548
Recomendado
Clasificación