剣指offer-アルゴリズムとデータ操作——再帰と循環
11781 ワード
春招刷問題ノート-剣指offer-アルゴリズムとデータ操作アルゴリズムとデータ操作——再帰的および循環的 再帰サイクル 1.フィボナッチ数列 .段差問題 .変態ジャンプステップ .矩形カバー アルゴリズムとデータ操作——再帰と循環
再帰と循環
1.フィボナッチ数列
タイトルはフィボナッチ数列をご存知ですが、現在は整数nを入力してください.フィボナッチ数列のn番目の項目(0から始まり、0番目は0)を出力してください.n<=39
テーマは一匹のカエルが一回に1段の階段を上がることができます.2段の階段を上がることもできます.このカエルが1つのn級の階段に上がることを求めて、全部でどれだけの種類の跳び方がありますか?
考え方の分析:階段を跳ぶのは変化のフィボナッチの数列の問題で、第n階段を跳ぶのは分解して第n-1階から1階を跳ぶのに加えて第n-2階から2階まで跳ぶことができて、だから第n階のが法を跳ぶのは第n-1階のが第n-2階のをプラスするのに等しいです.
テーマは一匹のカエルが一度に1段の階段を上がることができます.2段の階段を上がることもできます.このカエルが1つのn級の階段に跳ぶことを求めて、全部でどれだけの種類の跳躍法の構想がありますか?総階段がn段であれば、f(n)=f(n−1)+f(n−2)+…f(n−1)+f(n−n)+f(n−n)である.f(n-1)は、1回目のジャンプの1段目に残りのステップを加え、f(n-2)は1回目のジャンプの2段目に残りのステップを加え、f(n-3)は1回目のジャンプの3段目に残りのステップを加え、f(n-1)は1段目のジャンプの残りの回数を表し、f(n-n)は1段目のジャンプの残りの回数を表します.式の導出は以下の通りです.
f(n)=f(n-1)+f(n-2)+f(n-3)+f(1)+f(0)
f(n-1)=f(n-2)+f(n-3)+f(1)+f(0)
f(n)=2*f(n-1)
本道のテーマを任意に導出する公式は、2^(number-1)
テーマは私達が21の小さい長方形で横になったり、縦になったりして、より大きな長方形をカバーすることができます.すみません、n個の21の小さい長方形で重複なく2*nの大きな長方形をカバーするには、いくつの方法がありますか?
考え方の分析:8段階があると仮定して、最初のブロックが縦に置くと、残りの2*7の長方形に相当して保存します.f(7)に保存する方法があります.最初のブロックが横に置くと、最初のブロックの縦方向の位置も横にします.残りの2*6の長方形に相当してf(6)の保存方法があります.つまり、f(8)=f(7)+f(6)+f(6)+f(6).フィボナッチの数列の問題です.
再帰と循環
1.フィボナッチ数列
タイトルはフィボナッチ数列をご存知ですが、現在は整数nを入力してください.フィボナッチ数列のn番目の項目(0から始まり、0番目は0)を出力してください.n<=39
class Solution {
public:
long long Fibonacci(int n) {
long long pre0 = 0;
long long pre1 = 1;
long long res = 0;
int rest[2] = {0, 1};
if (n < 2)
return rest[n];
for (int i = 2; i <= n; i++) {
res = pre0 + pre1;
pre0 = pre1;
pre1 = res;
}
return res;
}
};
2.段差の問題テーマは一匹のカエルが一回に1段の階段を上がることができます.2段の階段を上がることもできます.このカエルが1つのn級の階段に上がることを求めて、全部でどれだけの種類の跳び方がありますか?
考え方の分析:階段を跳ぶのは変化のフィボナッチの数列の問題で、第n階段を跳ぶのは分解して第n-1階から1階を跳ぶのに加えて第n-2階から2階まで跳ぶことができて、だから第n階のが法を跳ぶのは第n-1階のが第n-2階のをプラスするのに等しいです.
class Solution {
public:
int jumpFloor(int number) {
long long pre0 = 1;
long long pre1 = 1;
long long res = 0;
int rest[2] = {0, 1};
if (number < 2)
return rest[number];
for (int i = 2; i <= number; i++) {
res = pre0 + pre1;
pre0 = pre1;
pre1 = res;
}
return res;
}
};
3.変態ジャンプステップテーマは一匹のカエルが一度に1段の階段を上がることができます.2段の階段を上がることもできます.このカエルが1つのn級の階段に跳ぶことを求めて、全部でどれだけの種類の跳躍法の構想がありますか?総階段がn段であれば、f(n)=f(n−1)+f(n−2)+…f(n−1)+f(n−n)+f(n−n)である.f(n-1)は、1回目のジャンプの1段目に残りのステップを加え、f(n-2)は1回目のジャンプの2段目に残りのステップを加え、f(n-3)は1回目のジャンプの3段目に残りのステップを加え、f(n-1)は1段目のジャンプの残りの回数を表し、f(n-n)は1段目のジャンプの残りの回数を表します.式の導出は以下の通りです.
f(n)=f(n-1)+f(n-2)+f(n-3)+f(1)+f(0)
f(n-1)=f(n-2)+f(n-3)+f(1)+f(0)
f(n)=2*f(n-1)
本道のテーマを任意に導出する公式は、2^(number-1)
class Solution {
public:
int jumpFloorII(int number) {
if (number == 0 || number == 1)
return number;
int res = 1;
for (int i = 1; i < number; i++)
res *= 2;
return res;
}
};
4.長方形のカバーテーマは私達が21の小さい長方形で横になったり、縦になったりして、より大きな長方形をカバーすることができます.すみません、n個の21の小さい長方形で重複なく2*nの大きな長方形をカバーするには、いくつの方法がありますか?
考え方の分析:8段階があると仮定して、最初のブロックが縦に置くと、残りの2*7の長方形に相当して保存します.f(7)に保存する方法があります.最初のブロックが横に置くと、最初のブロックの縦方向の位置も横にします.残りの2*6の長方形に相当してf(6)の保存方法があります.つまり、f(8)=f(7)+f(6)+f(6)+f(6).フィボナッチの数列の問題です.
class Solution {
public:
int rectCover(int number) {
if (number <= 0 || number == 1 || number == 2)
return number;
int res = 0;
int pre0 = 1;
int pre1 = 2;
for (int i = 3; i <= number; i++) {
res = pre0 + pre1;
pre0 = pre1;
pre1 = res;
}
return res;
}
};