leecode4 尋找兩個正序陣列的中位數

2022-06-23 17:03:08 字數 1579 閱讀 3637

1.題目描述

給定兩個大小分別為mn的正序(從小到大)陣列nums1nums2。請你找出並返回這兩個正序陣列的 中位數 。

2.示例

示例 1:

輸入:nums1 = [1,3], nums2 = [2]

輸出:2.00000

解釋:合併陣列 = [1,2,3] ,中位數 2

示例 2:

輸入:nums1 = [0,0], nums2 = [0,0]

輸出:0.00000

示例 3:

輸入: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.**

class

solution

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...