有兩個排序的陣列,長度都為n,求合併後的排序陣列的中位數。要求時間複雜度為log(n)。
解法1:直接的解法是遍歷兩個陣列並計數,類似歸併排序裡面的有序陣列的合併,複雜度為o(n)
解法2:分治策略:
設兩個陣列為a[n],b[n]。
若a[n/2] < b[n/2]:中位數k必定位於a[n/2]-a[n]、b[0]-b[n/2]。且k也是兩個陣列a[n/2]-a[n]、b[0]-b[n/2]的中位數。設a[i],b[j]為中位數k,則i+j = n;若a[n/2] > b[n/2]:中位數k必定位於a[0]-a[n/2]、b[n/2]-b[n]。且k也是兩個陣列a[0]-a[n/2]、b[n/2]-b[n]的中位數。
若a[n/2] == b[n/2],則a[n/2]為中位數。
若陣列無法細分下去,則可直接計算中位數。
若a[n/2] < b[n/2]:則 (i-n/2)+j = n/2;
k還是兩個陣列a[n/2]-a[n]、b[0]-b[n/2]的中位數。
時間複雜度:t(
n)=t
(n/2
)+f(
n)
f(n)
=o(1
)=o(
nlog
21)
t(n)=o(
nlog
21∗l
og(n
))=o
(log
(n))
#include
#include
#include
#include
#include
using
namespace
std;
#define debug_
double find_mid_core(vector
& nums1, vector
& nums2, int left_1, int right_1, int left_2, int right_2)
int mid_1 = left_1 + ((right_1 - left_1) >> 1);
int mid_2 = left_2 + ((right_2 - left_2) >> 1);
if (nums1[mid_1] > nums2[mid_2])
else
if (nums1[mid_1] < nums2[mid_2])
else
}double findmediansortedarrays(vector
& nums1, vector
& nums2)
int main()
; vector
vec_2;
cout
0;}
演算法題 兩個有序陣列求中位數
leetcode上遇到的一道題,感覺很有意思 因為要求o log m n 所以第一反應時用二分來找,但是該怎麼用二分呢?陣列a,b分別有序,我們可以先找到陣列a中的一條分界線i,使得陣列a分為a left,和a right兩部分,那麼因為時要找到中位數,我們可以直接計算出b陣列的一條分界線j,使得s...
兩個有序陣列中位數
大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n 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 v...
LeetCode 尋找兩有序陣列中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...