題目參見尋找兩個正序陣列的中位數。思路來自leetcode的官方題解。
尋找兩個正序陣列的中位數 給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和nums2。請你找出並返回這兩個正序陣列的中位數。如果是奇數,則返回第(m+n+1)/2小的數字,如果是偶數,則返回第(m+n)/2小的數和第(m+n)/2+1小的數兩數平均值。由於題目中的兩個陣列都是有序陣列,所以可以開闢乙個空間大小為m+n
m+nm+
n的陣列,用以儲存歸併後的新有序陣列。每次從兩個陣列之中選擇乙個較小的數字放到歸併後的新陣列中,最後從新陣列裡面挑選題目要求的中位數,並返回即可。
事實上,我們並不需要真正的開闢乙個空間大小為m+n
m+nm+
n這麼大的新陣列,我們其實只需要第(m+n+1)/2大的這乙個數字(如果是偶數,則需要兩個)數字而已,何必要開乙個完整陣列用以儲存呢?所以,維護乙個數字,在兩個陣列間進行兩兩比較的時候,只存留兩個陣列間最小的那個數字,一直遞增下標,直到找到第(m+n+1)/2小的數字為止即可。這樣空間複雜度則降為了o(1
)o(1)
o(1)
級別。**如下:
class
solution
if(n%2)
else
if(i < la) ans = a[i++];
else
if(j < lb) ans = b[j++];
id++;}
while
(id!=
(n+1)/
2);return ans;
}else
else
if(i < la) ans = a[i++];
else
if(j < lb) ans = b[j++];
id++;if
(id==n/
2||id==n/2+
1)}while
(id!=n/2+
1);return sum /2;
}}};
更普遍而言,我們考慮尋找兩個有序陣列中的第k小的數字。既然是兩個陣列,第乙個陣列中的第k
2\frac
2k個數字必然大於第乙個陣列中前面第k2−
1\frac-1
2k−
1個數字,第二個陣列中的第k
2\frac
2k個數字必然大於第二個陣列中的前面第k2−
1\frac-1
2k−
1個數字;這二者中最小的數字,最多也只能是大於了前面第k2−
1+k2
−1=k
−2
\frac-1+\frac-1=k-2
2k−1+
2k−
1=k−
2個數字(為什麼是「最多」呢,因為很有可能這個數字比另一組數字中的前k2−
1\frac-1
2k−
1個數字都要小),不會是第k
kk小的數字了,需要從該數字後面進行下一次二分查詢,同時也排除掉了k
2\frac
2k個數字(如果該陣列中容量不足k
2\frac
2k個,則會減少掉該陣列的總容量,我們記排除掉的數字為t
tt個),下次尋找的應該是第k−t
k-tk−
t小的數字了。思路清楚後,編寫**即可。
class
solution
else
}int
gettopk
(int k,
int m,
int n, vector<
int>
& nums1, vector<
int>
& nums2)
if(index2 == n)
if(k ==1)
mid_index1 =
min(index1 + k /2-
1, m-1)
; mid_index2 =
min(index2 + k /2-
1,n-1)
; nums_index1 = nums1[mid_index1]
; nums_index2 = nums2[mid_index2];if
(nums_index1 < nums_index2)
else}}
};
leetcode 4 尋找有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 n...
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...