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 計算...