lintcode兩個排序陣列的中位數

2021-08-07 15:04:30 字數 1310 閱讀 5042

兩個排序陣列的中位數 

兩個排序的陣列

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最後乙個元素進入...