当前位置:网站首页>Leetcode (4) - - trouver la médiane de deux tableaux ordonnés positifs
Leetcode (4) - - trouver la médiane de deux tableaux ordonnés positifs
2022-07-03 14:11:00 【Smileguy17】
Leetcode(4)——Trouver la médiane de deux tableaux de séquence positive
Titre
Les deux tailles données sont m m m Et n n n Ordre positif de(De petit en grand)Tableau n u m s 1 nums1 nums1 Et n u m s 2 nums2 nums2.S'il vous plaît trouver et retourner ces deux tableaux d'ordre positif Médiane .
La complexité temporelle de l'algorithme devrait être O ( l o g ( m + n ) ) O(log (m+n)) O(log(m+n)).
Exemple 1:
Entrée:nums1 = [1,3], nums2 = [2]
Produits:2.00000
Explication:Fusionner les tableaux = [1,2,3] ,Médiane 2
Exemple 2:
Entrée:nums1 = [1,2], nums2 = [3,4]
Produits:2.50000
Explication:Fusionner les tableaux = [1,2,3,4] ,Médiane (2 + 3) / 2 = 2.5
Conseils:
- nums1.length == m
- nums2.length == n
- 0 0 0 <= m <= 1000 1000 1000
- 0 0 0 <= n <= 1000 1000 1000
- 1 1 1 <= m + n <= 2000 2000 2000
- − 1 0 6 -10^6 −106 <= nums1[i], nums2[i] <= 1 0 6 10^6 106
Explication du problème
Fusionner et trouver d'autres façons de ne pas écrire , Complexité temporelle insuffisante et simplicité
Utiliser la fusion,Fusionner deux tableaux ordonnés,Obtenir un grand tableau ordonné.Éléments situés au milieu d'un grand tableau ordonné,Est la médiane.
- Il n'est pas nécessaire de fusionner deux tableaux ordonnés,Il suffit de trouver la position médiane.Comme la longueur des deux tableaux est connue,Par conséquent, la somme des indices des deux tableaux correspondant à la médiane est également connue.Maintenir deux pointeurs,Indice initial pointant vers deux tableaux 0 0 0 Emplacement,Déplacez le pointeur vers une valeur plus petite à la fois(Si un pointeur a atteint la fin du tableau,Il suffit de déplacer le pointeur d'un autre tableau),Jusqu'à la position médiane.
- Supposons que la longueur des deux tableaux ordonnés soit m m m Et n n n,Quelle est la complexité de ces deux idées?
La complexité temporelle de la première idée est O ( m + n ) O(m+n) O(m+n),La complexité spatiale est O ( m + n ) O(m+n) O(m+n).La deuxième idée, bien qu'elle puisse réduire la complexité spatiale à O ( 1 ) O(1) O(1),Mais la complexité temporelle reste O ( m + n ) O(m+n) O(m+n).
Méthode 1:Recherche binaire
Idées
S'il y a une exigence de complexité temporelle log \log log,Il faut habituellement une recherche binaire,Cette question peut également être réalisée par une recherche binaire.
Selon la définition de la médiane,Quand m + n m+n m+n C'est un nombre impair,La médiane est la deuxième de deux tableaux ordonnés ( m + n + 1 ) / 2 (m+n+1)/2 (m+n+1)/2 Éléments,Quand m + n m+n m+n Quand c'est un nombre pair,La médiane est la deuxième de deux tableaux ordonnés ( m + n ) / 2 (m+n)/2 (m+n)/2 Éléments et ( m + n ) / 2 + 1 (m+n)/2+1 (m+n)/2+1 Moyenne des éléments.
Donc,, Cette question peut se traduire par : Cherchez la deuxième dans deux tableaux ordonnés k k k Petit nombre,Quand m + n m+n m+n C'est un nombre impair, k k k Pour ( m + n ) / 2 + 1 (m+n)/2+1 (m+n)/2+1,Quand m + n m+n m+n Quand c'est un nombre pair, k k k Pour ( m + n ) / 2 (m+n)/2 (m+n)/2 Et ( m + n ) / 2 + 1 (m+n)/2+1 (m+n)/2+1.
L'idée de l'algorithme spécifique est la suivante :
Supposons que les deux tableaux ordonnés soient A \text{A} A Et B \text{B} B.Pour trouver k k k Éléments,Nous pouvons comparer A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Et B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1],Parmi eux / / / Représente la Division des entiers.
Parce que A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Et B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1] DeDevant.Séparément. A [ 0 . . k / 2 − 2 ] \text{A}[0\,..\,k/2-2] A[0..k/2−2] Et B [ 0 . . k / 2 − 2 ] \text{B}[0\,..\,k/2-2] B[0..k/2−2],C'est - à - dire: k / 2 − 1 k/2-1 k/2−1 Éléments,Pour A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Et B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1] Moins élevé de,Tout au plus. ( k / 2 − 1 ) + ( k / 2 − 1 ) ≤ k − 2 (k/2-1)+(k/2-1) \leq k-2 (k/2−1)+(k/2−1)≤k−2 Les éléments sont plus petits,Alors ça ne peut pas être la k k k Un petit nombre.
C'est pourquoi nous Trois situations peuvent être résumées :
- Si A [ k / 2 − 1 ] < B [ k / 2 − 1 ] \text{A}[k/2-1] < \text{B}[k/2-1] A[k/2−1]<B[k/2−1],Que A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Un nombre inférieur ou égal à au plus A \text{A} A Avant k / 2 − 1 k/2-1 k/2−1 Nombre et B \text{B} B Avant k / 2 − 1 k/2-1 k/2−1 Nombre,C'est - à - dire A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Petit nombreLa plupartSeulement k − 2 k-2 k−2 - Oui.,Donc, A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Ce n'est pas possible. k k k Nombre, A [ 0 ] \text{A}[0] A[0] À A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Ni l'un ni l'autre. k k k Nombre, A [ 0 ] \text{A}[0] A[0] À A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Tout peut être exclu.
- Si A [ k / 2 − 1 ] > B [ k / 2 − 1 ] \text{A}[k/2-1] > \text{B}[k/2-1] A[k/2−1]>B[k/2−1],EtPeut être exclu B [ 0 ] \text{B}[0] B[0] À B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1].
- Si A [ k / 2 − 1 ] = B [ k / 2 − 1 ] \text{A}[k/2-1] = \text{B}[k/2-1] A[k/2−1]=B[k/2−1],Et Peut être classé dans le premier cas de traitement .
Je vois.,Comparaison A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Et B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1] Après,Peut être exclu k / 2 k/2 k/2 C'est impossible. k k k Petit nombre,La recherche a été réduite de moitié.En même temps,Nous La recherche binaire se poursuivra sur le nouveau tableau exclu ,Et selon le nombre que nous excluons,,Diminution k k k Valeur de,C'est parce que nous n'excluons pas plus de k k k Petit nombre.
Il y a trois situations qui nécessitent un traitement spécial:
- Si A [ k / 2 − 1 ] \text{A}[k/2-1] A[k/2−1] Ou B [ k / 2 − 1 ] \text{B}[k/2-1] B[k/2−1] Hors de portée,Nous pouvons alors choisir le dernier élément du tableau correspondant.Dans ce cas,,Nous devons réduire en fonction du nombre d'exclusions k k k Valeur de,Au lieu de simplement k k k Moins k / 2 k/2 k/2.
- Si un tableau est vide,Description tous les éléments du tableau sont exclus,Nous pouvons retourner directement à la k k k Petits éléments.
- Si k = 1 k=1 k=1,Il suffit de retourner la valeur minimale des deux premiers éléments du tableau.
Exemple
Un exemple illustre l'algorithme ci - dessus.Supposons deux tableaux ordonnés comme suit::
La longueur des deux tableaux ordonnés est 4 4 4 Et 9 9 9,La somme des longueurs est 13 13 13,La médiane est la deuxième de deux tableaux ordonnés 7 7 7 Éléments,Il faut donc trouver k = 7 k=7 k=7 Éléments.
Comparer deux tableaux ordonnés avec un indice de k / 2 − 1 = 2 k/2-1=2 k/2−1=2 Nombre de,C'est - à - dire: A [ 2 ] \text{A}[2] A[2] Et B [ 2 ] \text{B}[2] B[2],Comme indiqué ci - dessous:
Parce que A [ 2 ] > B [ 2 ] \text{A}[2] > \text{B}[2] A[2]>B[2],Par conséquent, exclure B [ 0 ] \text{B}[0] B[0] À B [ 2 ] \text{B}[2] B[2],Tableau B \text{B} B Offset de l'indice pour(offset)Devient 3 3 3,Mise à jour simultanée k k k Valeur de: k = k − k / 2 = 4 k=k-k/2=4 k=k−k/2=4.
Recherche suivante,Comparer deux tableaux ordonnés avec un indice de k / 2 − 1 = 1 k/2-1=1 k/2−1=1 Nombre de,C'est - à - dire: A [ 1 ] \text{A}[1] A[1] Et B [ 4 ] \text{B}[4] B[4],Comme indiqué ci - dessous,Où les crochets indiquent le nombre qui a été exclu.
Parce que A [ 1 ] < B [ 4 ] \text{A}[1] < \text{B}[4] A[1]<B[4],Par conséquent, exclure A [ 0 ] \text{A}[0] A[0] À A [ 1 ] \text{A}[1] A[1],Tableau A \text{A} A Le décalage de l'indice devient 2 2 2,Mise à jour simultanée k k k Valeur de: k = k − k / 2 = 2 k=k-k/2=2 k=k−k/2=2.
Recherche suivante,Comparer deux tableaux ordonnés avec un indice de k / 2 − 1 = 0 k/2-1=0 k/2−1=0 Nombre de,Comparaison A [ 2 ] \text{A}[2] A[2] Et B [ 3 ] \text{B}[3] B[3],Comme indiqué ci - dessous,Où les crochets indiquent le nombre qui a été exclu.
Parce que A [ 2 ] = B [ 3 ] \text{A}[2]=\text{B}[3] A[2]=B[3],Selon les règles précédentes,Exclusion A \text{A} A Éléments dans,Par conséquent, exclure A [ 2 ] \text{A}[2] A[2],Tableau A \text{A} A Le décalage de l'indice devient 3 3 3,Mise à jour simultanée k k k Valeur de: k = k − k / 2 = 1 k=k-k/2=1 k=k−k/2=1.
Parce que k k k La valeur de devient 1 1 1,Comparez donc le premier nombre dans la gamme d'indices non exclus des deux tableaux ordonnés,Le plus petit de ces nombres est k k k Nombre,Parce que A [ 3 ] > B [ 3 ] \text{A}[3] > \text{B}[3] A[3]>B[3],Par conséquent, k k k Oui. B [ 3 ] = 4 \text{B}[3]=4 B[3]=4.
Mise en œuvre du Code
Leetcode Explication officielle:
class Solution {
public:
int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) {
/* Principales idées:Pour trouver k (k>1) Petits éléments,Alors prends - le. pivot1 = nums1[k/2-1] Et pivot2 = nums2[k/2-1] Comparer * Ici. "/" Indique la Division * nums1 Petite et moyenne taille égale à pivot1 Les éléments de nums1[0 .. k/2-2] Total général k/2-1 - Oui. * nums2 Petite et moyenne taille égale à pivot2 Les éléments de nums2[0 .. k/2-2] Total général k/2-1 - Oui. * Prends - le. pivot = min(pivot1, pivot2),Inférieur ou égal à pivot Le total des éléments ne dépassera pas (k/2-1) + (k/2-1) <= k-2 - Oui. * Voilà. pivot Le plus grand en soi ne peut être que k-1 Petits éléments * Si pivot = pivot1,Alors nums1[0 .. k/2-1] Ça ne peut même pas être k Petits éléments.Prenez tous ces éléments "Supprimer",Le reste comme nouveau nums1 Tableau * Si pivot = pivot2,Alors nums2[0 .. k/2-1] Ça ne peut même pas être k Petits éléments.Prenez tous ces éléments "Supprimer",Le reste comme nouveau nums2 Tableau * Grâce à nous "Supprimer" Quelques éléments(Ces éléments sont plus importants que k Les petits éléments sont plus petits),Des modifications sont donc nécessaires k Valeur de,Moins le nombre de suppressions */
int m = nums1.size();
int n = nums2.size();
int index1 = 0, index2 = 0;
while (true) {
// Situation aux frontières
if (index1 == m)
return nums2[index2 + k - 1];
if (index2 == n)
return nums1[index1 + k - 1];
if (k == 1)
return min(nums1[index1], nums2[index2]);
// Situation normale
int newIndex1 = min(index1 + k / 2 - 1, m - 1);
int newIndex2 = min(index2 + k / 2 - 1, n - 1);
int pivot1 = nums1[newIndex1];
int pivot2 = nums2[newIndex2];
if (pivot1 <= pivot2) {
k -= newIndex1 - index1 + 1;
index1 = newIndex1 + 1;
} else {
k -= newIndex2 - index2 + 1;
index2 = newIndex2 + 1;
}
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int totalLength = nums1.size() + nums2.size();
if (totalLength % 2 == 1)
return getKthElement(nums1, nums2, (totalLength + 1) / 2);
else
return (getKthElement(nums1, nums2, totalLength / 2) + getKthElement(nums1, nums2, totalLength / 2 + 1)) / 2.0;
}
};
Analyse de la complexité
Complexité temporelle: O ( l o g ( m + n ) ) O(log(m+n)) O(log(m+n)),Parmi eux m m m Et n n n Ce sont des tableaux nums 1 \textit{nums}_1 nums1 Et nums 2 \textit{nums}_2 nums2 Longueur.Au début, il y avait k = ( m + n ) / 2 k=(m+n)/2 k=(m+n)/2 Ou k = ( m + n ) / 2 + 1 k=(m+n)/2+1 k=(m+n)/2+1,Chaque cycle réduit de moitié la portée de la recherche,Donc la complexité temporelle est O ( log ( m + n ) ) O(\log(m+n)) O(log(m+n)).
Complexité spatiale: O ( 1 ) O(1) O(1)
Méthode 2:Recherche binaire+Tableau de partition
Idées
Pour résoudre ce problème en utilisant la méthode de partition ,Besoin de compréhension「 Quel est le rôle de la médiane 」, Si le rôle de la Division médiane est compris , C'est proche de la réponse ..Dans les statistiques, La médiane est utilisée :
Diviser un ensemble en deux sous - ensembles de longueur égale,Les éléments d'un sous - ensemble sont toujours plus grands que ceux d'un autre sous - ensemble.
Tout d'abord,,N'importe où i i i Oui. A \text{A} A Divisé en deux parties :
Parce que A \text{A} A Oui. m m m Éléments, Donc il y a m + 1 m+1 m+1 Méthode de division des espèces ( i ∈ [ 0 , m ] i \in [0, m] i∈[0,m]).
len ( left_A ) = i , len ( right_A ) = m − i \text{len}(\text{left\_A}) = i, \text{len}(\text{right\_A}) = m - i len(left_A)=i,len(right_A)=m−i
Attention!:Quand i = 0 i = 0 i=0 Heure, left_A \text{left\_A} left_A Pour un ensemble vide, Et quand i = m i = m i=m Heure, right_A \text{right\_A} right_A Pour un ensemble vide.
De la même manière,N'importe où j j j Oui. B \text{B} B Divisé en deux parties :
Oui. left_A \text{left\_A} left_A Et left_B \text{left\_B} left_B Dans une collection ,Et va right_A \text{right\_A} right_A Et right_B \text{right\_B} right_B Dans une autre collection . Et nommez ces deux nouvelles collections left_part \text{left\_part} left_part Et right_part \text{right\_part} right_part:
Quand A \text{A} A Et B \text{B} B Lorsque la longueur totale est pair ,Si ça peut être confirmé:
- len ( left_part ) = len ( right_part ) \text{len}(\text{left\_part}) = \text{len}(\text{right\_part}) len(left_part)=len(right_part)
- max ( left_part ) ≤ min ( right_part ) \max(\text{left\_part}) \leq \min(\text{right\_part}) max(left_part)≤min(right_part)
Alors, { A , B } \{\text{A}, \text{B}\} { A,B} Tous les éléments ont été divisés en deux parties de même longueur , Et l'élément de la partie précédente est toujours inférieur ou égal à l'élément de la partie suivante . La médiane est la moyenne du maximum de la partie précédente et du minimum de la partie suivante. :
median = max ( left _ part ) + min ( right _ part ) 2 \text{median} = \frac{\text{max}(\text{left}\_\text{part}) + \text{min}(\text{right}\_\text{part})}{2} median=2max(left_part)+min(right_part)
Quand A \text{A} A Et B \text{B} B Lorsque la longueur totale est impaire ,Si ça peut être confirmé:
- len ( left_part ) = len ( right_part ) + 1 \text{len}(\text{left\_part}) = \text{len}(\text{right\_part})+1 len(left_part)=len(right_part)+1
- max ( left_part ) ≤ min ( right_part ) \max(\text{left\_part}) \leq \min(\text{right\_part}) max(left_part)≤min(right_part)
Alors, { A , B } \{\text{A}, \text{B}\} { A,B} Tous les éléments ont été divisés en deux parties , La première partie a un élément de plus que la dernière , Et l'élément de la partie précédente est toujours inférieur ou égal à l'élément de la partie suivante . La médiane est la valeur maximale de la partie précédente :
median = max ( left _ part ) \text{median} = \text{max}(\text{left}\_\text{part}) median=max(left_part)
La première condition est différente pour les longueurs totales égales et impaires , Mais les deux cas peuvent être combinés . La deuxième condition est la même pour les longueurs totales pair et impair .
Pour s'assurer que ces deux conditions ,Il suffit de garantir:
- i + j = m − i + n − j i + j = m - i + n - j i+j=m−i+n−j(Quand m + n m+n m+n Même nombre)Ou i + j = m − i + n − j + 1 i + j = m - i + n - j + 1 i+j=m−i+n−j+1(Quand m + n m+n m+n C'est un nombre impair). Nombre d'éléments de la partie précédente à gauche du signe égal , Nombre d'éléments à droite du signe égal pour la dernière partie .Oui. i i i Et j j j Déplacez tout à gauche du signe égal ,Et nous aurons i + j = m + n + 1 2 i+j = \frac{m + n + 1}{2} i+j=2m+n+1. Le résultat de la fraction ici ne conserve que la partie entière .
- 0 ≤ i ≤ m 0 \leq i \leq m 0≤i≤m, 0 ≤ j ≤ n 0 \leq j \leq n 0≤j≤n. Si nous avions prévu A \text{A} A Longueur inférieure ou égale à B \text{B} B Longueur,C'est - à - dire: m ≤ n m \leq n m≤n. Pour n'importe quel i ∈ [ 0 , m ] i \in [0, m] i∈[0,m],Tous. j = m + n + 1 2 − i ∈ [ 0 , n ] j = \frac{m + n + 1}{2} - i \in [0, n] j=2m+n+1−i∈[0,n],Alors, on est là. [ 0 , m ] [0, m] [0,m] énumération dans le champ d'application de i i i Et obtenir j j j, Il n'y a pas besoin de propriétés supplémentaires .
- Si A \text{A} A La longueur de, On va juste échanger A \text{A} A Et B \text{B} B C'est tout..
- Si m > n m > n m>n, C'est tout. j j j Ça pourrait être négatif.
- B [ j − 1 ] ≤ A [ i ] \text{B}[j-1] \leq \text{A}[i] B[j−1]≤A[i] Et A [ i − 1 ] ≤ B [ j ] \text{A}[i-1] \leq \text{B}[j] A[i−1]≤B[j], C'est - à - dire que la valeur maximale de la partie précédente est inférieure ou égale à la valeur minimale de la partie suivante .
Pour simplifier l'analyse,Hypothèses A [ i − 1 ] , B [ j − 1 ] , A [ i ] , B [ j ] \text{A}[i-1], \text{B}[j-1], \text{A}[i], \text{B}[j] A[i−1],B[j−1],A[i],B[j] Toujours présent.Pour i = 0 i=0 i=0、 i = m i=m i=m、 j = 0 j=0 j=0、 j = n j=n j=n Ces conditions critiques , Il suffit de préciser A [ − 1 ] = B [ − 1 ] = − ∞ \text{A}[-1]=\text{B}[-1]=-\infty A[−1]=B[−1]=−∞, A [ m ] = B [ n ] = ∞ A[m]=\text{B}[n]=\infty A[m]=B[n]=∞ C'est tout.. C'est aussi plus intuitif : Lorsqu'un tableau n'apparaît pas dans la section précédente , La valeur correspondante est négative infinie , N'aurait pas d'effet sur la valeur maximale de la partie précédente ; Lorsqu'un tableau n'apparaît pas dans la dernière partie , La valeur correspondante est positive infinie , N'aurait pas d'effet sur la valeur minimale de cette dernière partie .
Ce qu'il nous faut, c'est:
In [ 0 , m ] [0, m] [0,m] Trouvé dans i i i,De faire:
B [ j − 1 ] ≤ A [ i ] \qquad \text{B}[j-1] \leq \text{A}[i] B[j−1]≤A[i] Et A [ i − 1 ] ≤ B [ j ] \text{A}[i-1] \leq \text{B}[j] A[i−1]≤B[j],Parmi eux j = m + n + 1 2 − i j = \frac{m + n + 1}{2} - i j=2m+n+1−i
Nous avons prouvé que c'est équivalent à :
In [ 0 , m ] [0, m] [0,m] Le plus grand i i i,De faire:
A [ i − 1 ] ≤ B [ j ] \qquad \text{A}[i-1] \leq \text{B}[j] A[i−1]≤B[j],Parmi eux j = m + n + 1 2 − i j = \frac{m + n + 1}{2} - i j=2m+n+1−i
C'est parce que:
- Quand i i i De 0 ∼ m 0 \sim m 0∼m Incrémental, A [ i − 1 ] \text{A}[i-1] A[i−1] Incrémental, B [ j ] \text{B}[j] B[j] Dégressif, Donc il doit y avoir un plus grand i i i Satisfaction A [ i − 1 ] ≤ B [ j ] \text{A}[i-1] \leq \text{B}[j] A[i−1]≤B[j];
- Si i i i C'est le plus grand.,Alors, ça veut dire i + 1 i+1 i+1 Insatisfait.Oui. i + 1 i+1 i+1 On peut obtenir A [ i ] > B [ j − 1 ] \text{A}[i] > \text{B}[j-1] A[i]>B[j−1],C'est - à - dire B [ j − 1 ] < A [ i ] \text{B}[j - 1] < \text{A}[i] B[j−1]<A[i], Juste avant la transformation équivalente avec nous i i i La nature de ( Encore mieux ).
Pour qu'on puisse i i i In [ 0 , m ] [0, m] [0,m] Recherche binaire dans l'intervalle de , Trouver la plus grande satisfaction A [ i − 1 ] ≤ B [ j ] \text{A}[i-1] \leq \text{B}[j] A[i−1]≤B[j] De i i i Valeur, On obtient la méthode de division .En ce moment, Diviser les valeurs maximales des éléments de la partie précédente , Et la plus petite des Parties suivantes de l'élément , C'est la médiane de ces deux tableaux. .
Mise en œuvre du Code
Leetcode Explication officielle:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
return findMedianSortedArrays(nums2, nums1);
}
int m = nums1.size();
int n = nums2.size();
int left = 0, right = m;
// median1:Valeur maximale de la partie précédente
// median2:Valeur minimale pour cette dernière partie
int median1 = 0, median2 = 0;
while (left <= right) {
// La partie précédente contient nums1[0 .. i-1] Et nums2[0 .. j-1]
// Cette dernière partie contient nums1[i .. m-1] Et nums2[j .. n-1]
int i = (left + right) / 2;
int j = (m + n + 1) / 2 - i;
// nums_im1, nums_i, nums_jm1, nums_j Représente séparément nums1[i-1], nums1[i], nums2[j-1], nums2[j]
int nums_im1 = (i == 0 ? INT_MIN : nums1[i - 1]);
int nums_i = (i == m ? INT_MAX : nums1[i]);
int nums_jm1 = (j == 0 ? INT_MIN : nums2[j - 1]);
int nums_j = (j == n ? INT_MAX : nums2[j]);
if (nums_im1 <= nums_j) {
median1 = max(nums_im1, nums_jm1);
median2 = min(nums_i, nums_j);
left = i + 1;
} else {
right = i - 1;
}
}
return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;
}
};
Analyse de la complexité
Complexité temporelle: O ( log min ( m , n ) ) ) O(\log\min(m,n))) O(logmin(m,n))),Parmi eux m m m Et n n n Ce sont des tableaux nums 1 \textit{nums}_1 nums1 Et nums 2 \textit{nums}_2 nums2 Longueur. L'intervalle de recherche est [ 0 , m ] [0, m] [0,m], La longueur de l'intervalle est réduite de moitié après chaque cycle .Alors...,Il suffit d'exécuter log m \log m logm Sous - cycle. Parce que le nombre d'opérations par cycle est constant ,Donc la complexité temporelle est O ( log m ) O(\log m) O(logm). Parce que nous pourrions avoir besoin d'échanger nums 1 \textit{nums}_1 nums1 Et nums 2 \textit{nums}_2 nums2 De faire m ≤ n m \leq n m≤n Et nous La recherche binaire n'a été effectuée que sur des tableaux plus courts ,Donc la complexité temporelle est O ( log min ( m , n ) ) ) O(\log\min(m,n))) O(logmin(m,n))).
Complexité spatiale: O ( 1 ) O(1) O(1)
边栏推荐
- allegro,orcad, net alias,port,off-page connector之间的异同点和如何选取
- JVM family - overview, program counter day1-1
- 战略、战术(和 OKR)
- 全局事件总线
- Thrift threadmanager and three monitors
- MIL-100( Fe) 包裹小分子阿司匹林形成[email protected](Fe)|甘草次酸修饰金属有机框架材料UiO-66-NH2(简称UiO-66-NH2-GA)
- 关于回溯问题中的排列问题的思考(LeetCode46题与47题)
- Webpage connection database ~ simple implementation of addition, deletion, modification and query complete code
- Implementation of Muduo accept connection, disconnection and sending data
- Generate directories from web content
猜你喜欢
7-10 calculate salary
Metal organic framework (MOFs) antitumor drug carrier | pcn-223 loaded with metronidazole | uio-66 loaded with ciprofloxacin hydrochloride(
[email protected] Nanoparticles) | nano metal organic framework carry"/>
Metal organic framework material zif-8 containing curcumin( [email protected] Nanoparticles) | nano metal organic framework carry
QT learning 17 dialog box and its types
Spring cup eight school league
QT learning 21 standard dialog box in QT (Part 2)
Redis: operation command of string type data
Leetcode(4)——尋找兩個正序數組的中比特數
Exercise 10-1 calculate the sum of 1 to n using recursive functions
JVM family - overview, program counter day1-1
随机推荐
Formation of mil-100 (FE) coated small molecule aspirin [email protected] (FE) | glycyrrhetinic acid modified metal organ
JS Part 2
Cross linked cyclodextrin metal organic framework loaded methotrexate slow-release particles | metal organic porous material uio-66 loaded with flavonoid glycosides | Qiyue
QT learning 25 layout manager (4)
fpga阻塞赋值和非阻塞赋值
JS input number and standard digit number are compared. The problem of adding 0 to 0
Similarities and differences of sessionstorage, localstorage and cookies
QT learning 24 layout manager (III)
Learn to punch in today
JS Part III
Exercise 9-1 time conversion
Fabric. JS document
QT learning 19 standard dialog box in QT (top)
Exercise 10-6 recursively find Fabonacci sequence
Dynamic programming 01 knapsack and complete knapsack
Webpage connection database ~ simple implementation of addition, deletion, modification and query complete code
金属有机骨架(MOFs)抗肿瘤药载体|PCN-223装载甲硝唑|UiO-66包载盐酸环丙沙星([email protected])
Qt学习24 布局管理器(三)
6-9 statistics of single digits (15 points)
从零开始的基于百度大脑EasyData的多人协同数据标注