当前位置:网站首页>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)
边栏推荐
- 7-11 calculation of residential water charges by sections
- Page generation QR code
- Qt学习19 Qt 中的标准对话框(上)
- Uniapp skills - dom display and hiding
- 好看、好用、强大的手写笔记软件综合评测:Notability、GoodNotes、MarginNote、随手写、Notes Writers、CollaNote、CollaNote、Prodrafts、Noteshelf、FlowUs、OneNote、苹果备忘录
- Uniapp tips - set background music
- Multi person collaborative data annotation based on Baidu brain easydata from scratch
- Print. JS -- web page file printing
- Invalid Z-index problem
- Onmenusharetimeline custom shared content is invalid, and the title and icon are not displayed
猜你喜欢

Why are grass-roots colleges and universities with "soil and poverty" called "Northeast small Tsinghua"?

7-10 calculate salary

MySQL data processing value addition, deletion and modification

Redis: operation command of string type data

Qt学习18 登录对话框实例分析

JVM runtime data area

3D vision - 2 Introduction to pose estimation - openpose includes installation, compilation and use (single frame, real-time video)
[email protected]纳米颗粒)|纳米金属有机框架搭载雷帕霉素|科研试剂"/>金属有机骨架材料ZIF-8包载姜黄素([email protected]纳米颗粒)|纳米金属有机框架搭载雷帕霉素|科研试剂

FPGA测试方法以Mentor工具为例

Dlopen() implements dynamic loading of third-party libraries
随机推荐
MIL-100( Fe) 包裹小分子阿司匹林形成[email protected](Fe)|甘草次酸修饰金属有机框架材料UiO-66-NH2(简称UiO-66-NH2-GA)
Similarities and differences of sessionstorage, localstorage and cookies
[combinatorics] permutation and combination (two counting principles, examples of set permutation | examples of set permutation and circle permutation)
Exercise 10-6 recursively find Fabonacci sequence
Uio-66-cooh loaded bendamostine | hydroxyapatite (HA) coated MIL-53 (FE) nanoparticles | baicalin loaded manganese based metal organic skeleton material
Solve the problem of dormitory router campus network sharing login
Scroll detection, so that the content in the lower right corner is not displayed at the top of the page, but is displayed as the mouse slides
JS shift operators (< <,> > and > > >)
Invalid Z-index problem
Global event bus
Exercise 6-6 use a function to output an integer in reverse order
How to use lxml to judge whether the website announcement is updated
Spring cup eight school league
Exercise 7-6 count capital consonants
Metal organic framework material zif-8 containing curcumin( [email protected] Nanoparticles) | nano metal organic framework carry
Redis:字符串類型數據的操作命令
jvm-类加载
Implementation of Muduo accept connection, disconnection and sending data
Why are grass-roots colleges and universities with "soil and poverty" called "Northeast small Tsinghua"?
JVM object lifecycle