演算法 有序陣列中值

2021-10-04 23:43:30 字數 1259 閱讀 5465

有兩個已排序陣列a、b,各自大小分別為m,n。找到兩個已排序陣列的中值。

將整個集合分為兩個等長的子集,使一邊的值總是大於另一邊。這道題,可以將a、b看作乙個整體,然後劃分為左右兩部分l和r,並且滿足ma

x(l)

<=mi

n(r)

max(l)<=min(r)

。當總個數(m+n)位奇數時,結果為:ma

x(l)

max(l)

當總個數(m+n)為偶數時,結果為:ma

x(l)

+min

(r)2

max(l)+min(r)2

這樣一來,問題簡化為了尋找平分整個集合的方法,假設

0<=

i<=

m0<=i<=m

,使用 ii

將陣列a分為a0~ai-1和ai~am-1,因此想要將集合均分,則需要j=

m+n+

12j=m+n+12

,將陣列b分為b0~bj-1 和bj~bn-1,於是陣列分為了如下兩部分。lr

a[0],a[1],…,a[i-1]

a[i],a[i+1],…,a[m-1]

b[0],b[1],…,b[j-1]

b[j],b[j+1],…,b[n-1]

於是題目轉化為,尋找合適的 ii

,使得max

(l)n(r)

max(l),於是我們可以使用二分法來查詢ii

值,找到ii

值後,就可以求出結果了。

public

static

double

findmediansortedarrays (int a, int b)

int m = a.length, n = b.length;

int imin = 0, imax = m, halflength = (m+n+1)/2;

while (imin <= imax) else

if (i > imin && a[i-1] > b[j]) else else

if (j == 0) else

//總個數字奇數時,返回max(l)

if ((m + n)%2==1)

int minright = 0;

if (i == m) else

if (j == n) else

return (maxleft+minright)/2.0;}}

return

0; }

求兩個有序陣列的中值

設陣列a的長度為m,陣列b的長度為n,兩個陣列都都是遞增有序的。求這兩個陣列的中值 如下 include int find median int a,int b,int m,int n,int s,int t b為空 if 0 n a p 太小了,從陣列a中找乙個更大的數嘗試 if c p 1 n ...

演算法有序陣列合併

最近看一本書上有乙個面試題,原題目是 有兩個遞增陣列 a1 a2,a1的記憶體空間足夠長,現在要求合併 a2到a1,並且要求移動次數最小 面試的時候 我們盡量要以 最高效的方式完成 下面是此題 o n 解法。合併 void mergearray int arra1,int arra2,int nle...

演算法 有序陣列求目標和

在有序陣列中找出兩個數,使它們的和為 target.例如 array target 為 6 則 返回和為 6 的 array下標 使用雙指標,乙個指標指向值較小的元素,乙個指標指向值較大的元素。指向較小元素的指標從頭向尾遍歷,指向較大元素的指標從尾向頭遍歷。param nums the sorted...