1.題目描述
給定兩個大小分別為m
和n
的正序(從小到大)陣列nums1
和nums2
。請你找出並返回這兩個正序陣列的 中位數 。
2.示例
示例 1:
輸入:nums1 = [1,3], nums2 = [2]示例 2:輸出:2.00000
解釋:合併陣列 = [1,2,3] ,中位數 2
輸入:nums1 = [0,0], nums2 = [0,0]示例 3:輸出:0.00000
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合併陣列 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
3.分析
此題難度不大,有如下思路
(1)最簡單的想法是,將乙個陣列的每乙個元素,按照公升序通過插入法等方法將兩個陣列合併。然後根據奇偶性質找出中位數的位置並計算。
但是這種方法不是高效的,空間上它需要重新申請乙個m+n長度的新陣列。至少也需要將較短的那個陣列重新申請空間到較長的那個陣列上。
時間上,由於每次需要將乙個元素有序插入到另乙個陣列中,時間也會有較大的浪費。
(2)根據上面的方法,時間浪費的原因在於沒有利用好兩個陣列已經有序的條件。改進的方法,不再將兩個陣列和並,也不關心中位數之後的元素
的排序。通過兩個陣列的元素和計算出中位數的位置,設定指向兩個陣列的兩個游標進行移動。在兩個陣列的元素都沒被遍歷完時,比較當前兩個游標對應的元素大小,使較小元素的游標後移。
在某乙個陣列已經被比較完時,則將另乙個陣列的元素順序不動遍歷即可,直到整體的游標數到達中位數的位置。
這樣就提高了時間和空間的效率,類似流的不儲存元素的值,只關心中位數的位置。達到了空間複雜度為o(m+n)
4.**
classsolution
else
if(numpos1;
else numpos2++;
counter++;
}if(numpos1nums2.size())
else
if(numpos1nums1.at(numpos1);
else result+=nums2.at(numpos2);
}else
else
if(numpos1;
else numpos2++;
counter++;
}for(int i=0;i<2;i++)
else
}else
if(numpos1;}
else
}result =result/2
; }
return
result;
}};
5.總結
(1)上述**不夠優雅,原因是一開始就將奇偶分開處理,導致有很大程度的重複**。
(2)這也說明了這個題的細節問題:即對奇偶元素個數的游標位置的處理細節。
leecode4 尋找兩個有序陣列的中位數
馬上就要開始吧找工作啦,本科沒有刷leecode,現在開始刷題啦!每天一道題,堅持下去,加油吧!給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。...
4 尋找兩個正序陣列的中位數
思路 我現在還沒有進行優化,大概就是合併陣列 參照之前的順序表合併 然後如果合併陣列的大小sum是偶數,返回sum 2和sum 2 1兩個元素除以二,如果sum是奇數則直接返回sum 2的元素 double findmediansortedarrays int nums1,int nums1size...
4 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nu...