題目:有兩個長為n的非遞減陣列a和b,把b接在a的後面變成長為2n的陣列c。設計演算法求c的中位數(第n小數)。
思路:o(n)的演算法很容易找到,關鍵是用二分的思想設計logn演算法。這題關鍵是用好a和b陣列中腳標和為定值的元素的大小關係。
直觀想法是:如果中位數在陣列a中,那麼若a[m]b [n-m-1],此時比a[m]小的數至少有n個,a[m]不可能為第n小數,偏大更新右界;若a[m]介於b[n-m-2]與b [n-m-1]則a[m]恰好為第n小數。 中位數在陣列b中的情況類似。
[cpp]view plain
copy
#include
using
namespace
std;
intfindnthnumber(
inta,
intb,
intn)
else
if(a[m] < b [n - m - 1])
else
r = m - 1;
//此時比a[m]小的數至少有n個,即a[m]不可能為第n小數,偏大更新右界
} //中位數在b陣列中的情況,和上面類似
l = 0, r = n -1;
while
(l <= r)
else
if(b[m] < a [n - m - 1])
else
r = m - 1;
} }
intmain();
intb = ;
cout0;
}
也可以取a[m]與b[n-m-2]中較大的乙個,然後與a[m+1]和b[n-m-1]作比較,簡化後的**如下
[cpp]view plain
copy
#include
using
namespace
std;
intfindnthnumber(
inta,
intb,
intn)
else
if(tmp > a [m + 1])
else
return
tmp;
} }
intmain();
intb = ;
cout0;
}
求兩個等長有序陣列的中位數
設兩個有序陣列的長度均為n,求它們組成的2n長的陣列的中位數。首先說明下中位數的定義 統計學名詞,當變數值的項數n為奇數時,處於中間位置的變數值即為中位數 當n為偶數時,中位數則為處於中間位置的2個變數值的平均數。中位數有個性質 在中位數兩側去掉任意數量的數後,中位數不變 為了簡化,先假設n為奇數,...
求兩個等長有序陣列的中位數
兩個有序陣列的長度均為 n,求它們組成的 2n 長的陣列的中位數。中位數的定義 統計學名詞,當變數值的項數 n 為奇數時,處於中間位置的變數值即為中位數 當 n 為偶數時,中位數則為處於中間位置的 2 個變數值的平均數。中位數的性質 在中位數兩側去掉任意數量的數後,中位數不變。舉個例子 思路 找出將...
求兩個有序非等長陣列中位數
本部落格所用演算法是受另外一篇部落格所啟發,但該博主給出的 很多邊界條件和n m為偶數的情況未考慮到,這裡我做了一定的完善。原題如下 there are two sorted arrays nums1 and nums2 of size m and n respectively.find the m...