倆個相同大小公升序序列合併在一起的中位數解法

2021-09-26 14:50:25 字數 1282 閱讀 3981

這道題貌似還是一道考研題,但是很久了 好像是2023年的。大概意思就是乙個如果乙個序列s1(11,13,15,17,19)則中位數是15, s2=(2,4,6,8,20) ,如果把s1和s2按照公升序合在一起則11是中位數。

讓你寫演算法:

當然最常見的無非就是把他倆放在乙個陣列裡然後直接就找到中間那個了,但是這樣的演算法複雜度就會變成o(n),有沒有更好的辦法呢,當然首先就要利用中位數的性質。

假設乙個數列 a1 a2 a3 a4 …ak,ak+1,ak+2 …an 其中ak為中位數,如果我左右排除掉同樣多的個數,會不會影響中位數的值呢,答案是當然不會,舉個栗子

中位數為6,那我左邊把1,3去掉 右邊把10,12去掉 數列變為 4,5,6,8,9 。 中位數依舊是6啊。所以我們的演算法變了,從原來的把倆個排序數列組合到一起去找,變成減少陣列的個數方便查詢。換句話說捨棄肯定中位數不在的陣列元素,但是必須捨棄一樣的數量,不然中位數就不對了。

那問題又來了 怎麼最有效捨棄一樣的數量,答案是二分法。。。

比較倆個數列的中位數,為了方便 設乙個為a數列乙個為b數列。ak為a數列的中位數,bk為b數列的中位數。,如果ak>bk說明了什麼,說明bk的前面的元素注定了不會有中位數的存在了同樣ak後面的元素就更大了 也不會有中位數的存在了。。

這樣他們就是可以被捨棄的物件,但是請注意。。他們數量是相等的嗎? 你會發現有時候相等,有時候不等。。。這個跟數列奇數個元素還是偶數個元素相關,那我們分別討論。。。

當元素個數是奇數個的時候。。也就是說恰好中位數左邊的個數和右邊的個數是相等的。這個時候捨棄起來很省事。。。正好一樣數量啊

但是當元素個數是偶數個的時候。。假設還是ak>bk這種情形 bk元素的前面是捨棄了和ak後面的元素數量是不相等的,數量上差乙個。這個你可以自己舉例子,bk那邊少了乙個,可你仔細一想bk,是肯定不會成為中位數的,所以為了數量相同,bk一樣捨棄掉,這樣就保證了數量相同。

下面是**`

#include #include#define m 10

#define n 10

void ran(int a,int n) //隨機數組數

else

}} return a[lowa]b[j])

c[k++]=b[j++];

} while(ic[k++]=a[i++];

while(jc[k++]=b[j++];

output(c,m+n);

printf("test x=%d\n",c[k/2-1]); }

int main(int argc, char *ar**)

合併K個公升序鍊錶

給你乙個鍊錶陣列,每個鍊錶都已經按公升序排列。請你將所有鍊錶合併到乙個公升序鍊錶中,返回合併後的鍊錶。示例 1 輸入 lists 1,4,5 1,3,4 2,6 輸出 1,1,2,3,4,4,5,6 解釋 鍊錶陣列如下 1 4 5,1 3 4,2 6 將它們合併到乙個有序鍊錶中得到。1 1 2 3 ...

將兩個公升序排列的鍊錶合併後公升序排序列印

include include include define len sizeof struct student struct student int n 全域性變數n 用記錄鍊錶的結點數.struct student creat void 建立鍊錶的函式原型宣告.void print struct...

遞迴法合併倆個單鏈表

原題如下 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。我覺得解題思路用這一張圖就可以表達的很清楚了。我的 非遞迴的,遞迴的在下面 public class listnode public class solution if list2 null lis...