題目描述
題目鏈結
給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
示例 3:
輸入:nums1 = [0,0], nums2 = [0,0]
輸出:0.00000
示例 4:
輸入:nums1 = , nums2 = [1]
輸出:1.00000
示例 5:
輸入:nums1 = [2], nums2 =
輸出:2.00000
自己做題時的想法
將兩個vector合併到一起+sort+返回新序列的中位數
emmm…雖然可以過 但是沒有達到題目的另乙個要求 時間複雜度控制在o(log(m+n))
但是 這個做法的時間複雜度取決於排序 即o((m+n)log(m+n))
【m為第乙個序列的長度 n為第二個序列的長度】
觀摩了官方解答後
自己的理解
一般題目要求log的複雜度 就大概率要用到二分查詢了
回到這個題目 題目求中位數
那麼肯定要分為兩類
假設兩個有序陣列分別是a和b 要找到第k個元素 即可轉化為比較a[k/2-1]和b[k/2-1]中的較小值 對於這個求出的較小值 它最多隻可能是第k-1個元素 不會是第k個元素 因此可以排除在外
分成兩種情況討論
在每次這種比較後,都可以排除k/2個元素,此時搜尋範圍減小一半,然後再在新的陣列上進行新一輪的二分查詢
邊界處理
class
solution
else}}
double
findmediansortedarrays
(vector<
int>
& nums1, vector<
int>
& nums2)
else}}
;
尋找兩個正序陣列的中位數
尋找兩個正序陣列的中位數 二分法根據中位數的定義,當 m n 是奇數時,中位數是兩個有序陣列中的第 m n 2 個元素,當 m n 是偶數時,中位數是兩個有序陣列中的第 m n 2 個元素和第 m n 2 1 個元素的平均值。因此,這道題可以轉化成尋找兩個有序陣列中的第 k 小的數,其中 k 為 m...
尋找兩個正序陣列的中位數
題目 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 思路 因為兩...
尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數 示例 1 輸入 nums1 1,3 nums2 2 輸出 2.00000 解釋 合併陣列 1,2,3 中位數 2 示例 2 輸入 nums1 1,2 nums2 3,4 輸出 2.5...