演算法題 兩有序陣列中位數

2021-08-07 11:14:00 字數 1442 閱讀 4716

有兩個排序的陣列,長度都為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[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[i],b[j]為中位數k,則i+j = n;

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