遞迴分治問題刷題

2021-09-29 12:09:20 字數 1798 閱讀 1252

1.漢洛塔問題

這個問題可以從只有乙個盤子進行逆推,可以寫成遞迴**

**如下

#include#includeusing namespace std;

/*漢羅塔問題 ,可以從一開始推測

*/void printf(int n, char a, char b)

void pr(int n,char a,char b,char c)

pr(n - 1, a, c, b);

printf(n, a, c);

pr(n - 1, b, a, c);

}void main()

2.兩個有序陣列裡尋找中位數

第一種方法比較簡單,是利用歸併陣列之後很輕鬆的就可以求出

中位數。

**如下

#include#includeusing namespace std;

/*尋找兩個排序陣列的中位數,我們可以想到歸併這兩個陣列

然後中位數就可以解決,其實我們可以在歸併的過程中進行判斷

*/double pr(const vector&a, const vector&b)

int al = 0, ar = n - 1, bl = 0, br = n1 - 1;

int k = 0;

int m = n + n1;//確定中位數是幾個

bool judge = false;

if (m & 1)

m = m / 2;

while (al <= ar&&bl <= br)

else

}if (al > ar) }

else }

//確定中位數

if (judge)

else }

}void main()

; vectorb;

cout << pr(a, b) << endl;

system("pause");

}

第二種方法是利用了二分法進行判斷

這種方法的思路是尋找到第n個小的數

思路如下

#include#includeusing namespace std;

/*尋找兩個排序陣列的中位數,

我們假設存在兩個陣列

a1 a2 a3 a4

b1 b2 b3 b4

我們的函式作用尋找第n大的數字

例如第四大 那麼我們利用2分

4/2=2

比較a3與b3如果a3>b3 那麼我們可以知道b1與b2肯定不是第四大

我們可以去掉b1與b2

同理 我們可以這樣遞迴下去

以上是兩個陣列大小一樣的情況,當陣列大小情況不一樣時,我們的二分有可能會超過邊界

那麼我們應該進行判斷

*/int find(vector&a, vector&b, int k,int i,int j)//找到第k個大的數

int m = k / 2;

int p = m + i;

int q = m + j;

if (p>=a.size())//如果超出範圍,等於最大值6

p = a.size()-1;

if (q >=b.size())

q = b.size()-1;

if (a[p]>b[q])//如果大與 去除另乙個陣列的數字

if (a[p]&a, int n)

}void main()

else

system("pause");

}

總結:

C LeetCode刷題 分治演算法

分治演算法篇 題名刷題通過率難度 4兩個排序陣列的中位數 c leetcode刷題之 4 兩個排序陣列的中位數 median of two sorted arrays 該題未達最優解 30.9 困難23 合併k個排序鍊錶 39.4 困難53 最大子序和 c leetcode刷題之 53 最大子序和 ...

遞迴 刷題筆記

2019.9.26 阿蕭上了c語言課並表示暈遞迴 我覺得一定要表現一波,加之之前看書也囫圇吞棗,還是做點題加深理解吧,畢竟遞迴比十連for 草 漂亮多了 漢諾塔問題 只求步數 公式分析 1階 1 1 c 2階 3 1 b 2 c 1 c 3階 7 1 c 2 b 1 b 3 c 1 a 2 c 1 ...

眾數問題(遞迴 分治)

所謂眾數,就是對於給定的含有n個元素的多重集合,每個元素在s中出現次數最多的成為該元素的重數,多重集合s重的重數最大的元素成為眾數。例如 s 則多重集s的眾數是2,其重數為3。現在你的任務是 對於給定的由m個自然數組成的多重集s,計算出s的眾數及其重數。解題思路 1 快速排序 2 求中位數 3 計算...