兩個排序陣列的中位數
兩個排序的陣列
a和b分別含有m和n個數,找到兩個排序陣列的中位數,要求時間複雜度應為o(log (m+n))。
您在真實的面試中是否遇到過這個題?
yes
樣例給出陣列a =[1,2,3,4,5,6]
b = [2,3,4,5]
,中位數3.5
給出陣列a = [1,2,3]
b = [4,5]
,中位數 3
挑戰
標籤
相關題目
分析:這道題折騰了好幾天,今天總算弄明白了。可能我太笨了,如果在考試中遇到這種難度的題解個幾天都解不出來@。@
看到這個題的第一反應是把兩個陣列遍歷一遍並組合到乙個陣列中,取中位數就很簡單了。這樣做的時間複雜度為o(m+n),可還是能通過測試,可能lintcode沒有檢測時間複雜度?
時間複雜度為o(m+n)的方法是在別人的方法之上,修修補補才能放在這個題目下執行起來的。。。心疼自己的智商
本題從時間複雜度來看就是採用二分法,該方法的核心是將原問題轉變成乙個尋找第k小數的問題(假設兩個原序列公升序排列),這樣中位數實際上是第(m+n)/2小的數。所以只要解決了第k小數的問題,原問題也得以解決。因為a和b都是公升序的,理想情況下假設a和b的個數都大於k/2(這裡的k就是兩個數組合起來的中位數(m+n)/2)。首先比較a[k/2-1]和b[k/2-1]
情況一:a[k/2-1]二:當a[k/2-1]三:當a[k/2-1]=b[k/2-1]時,說明已經找到了中位數,返回其中任意乙個即可。
對於一些邊界情況,當a或者b為空時,直接返回不為空的陣列中位數;
當k=1時(因為每次遞迴都會改變中位數的值),返回a和b中第乙個元素較小者
因為這道題給的是向量vector的形式而不是陣列,所以為了表示下標可能**有點凌亂,下為**
class solution
// return (findkth(a,b,0,0,m,n,s/2)+findkth(a,b,0,0,m,n,s/2+1))/2;
}private:
double findkth(vectora, vectorb,int start1,int start2,int m,int n,int k)//start1,start2代表每個vector起始的下標;m,n代表各vector剩餘的元素個數
//本題捨棄的均為各自陣列所選下標之前的元素
};
兩個排序陣列的中位數
accepted
總耗時:
316 ms
100% 資料通過測試.
lintcode 兩個排序陣列的中位數
描述 兩個排序的陣列a和b分別含有m和n個數,找到兩個排序陣列的中位數,要求時間複雜度應為o log m n 樣例 給出陣列a 1,2,3,4,5,6 b 2,3,4,5 中位數3.5 給出陣列a 1,2,3 b 4,5 中位數 3 public class solution else if b.l...
lintcode 2 兩個排序陣列的中位數
中文english 兩個排序的陣列a和b分別含有m和n個數,找到兩個排序陣列的中位數,要求時間複雜度應為o log m n 樣例1 輸入 a 1,2,3,4,5,6 b 2,3,4,5 輸出 3.5樣例2 輸入 a 1,2,3 b 4,5 輸出 3時間複雜度為o log n 演算法1 最簡單的辦法就...
LintCode 合併兩個排序好的陣列
題目 合併兩個排序好的陣列,要求新陣列也是有序的 分析 假設兩個陣列為a和b,新陣列為c。a和b的元素比較,小的放在c中,並且指標 1。臨界條件很重要 假設a的指標越界 退出迴圈的條件 那麼b的指標肯定沒有越界 為什麼?看 並且b未比較的元素一定比a所有元素大 a指標都越界了,說明a最後乙個元素進入...