斐波那階數列
題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0,第1項是1)。
n<=39
思路:
其實我們可以發現每次就用到了最近的兩個數,所以我們可以只存儲最近的兩個數
- sum 存儲第 n 項的值
- one 存儲第 n-1 項的值
- two 存儲第 n-2 項的值
class Solution {
public:
int Fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int sum = 0;
int one = 1;
int two = 0;
for (int i = 2; i <= n; i ++)//必須得<=n
{
sum = two + one;
two = one;
one = sum;
}
return sum;
}
};
跳臺階
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
思路:
參考:https://www.nowcoder.com/questionTerminal/8c82a5b80378478f9484d87d1c5f12a4?answerType=1&f=discussion
本質上還是斐波那契數列,所以迭代也可以求
當成 dp 問題來想的話:首先分析問題,它最終解是由前面的解累積起來的解,如何縮小問題的規模?
首先可知,第一階有隻能一步,一種;,第二階可以兩次一步、一次兩步兩種
- 若樓梯階級 n = 3
- 跳 2 步到 3:剩下的是第一步沒跳,起始跳到第一步只有一種
- 跳 1 步到 3:剩下的是第二步沒跳,起始跳到第二步有兩種
通過分類討論,問題規模就減少了:
- 若樓梯階級 n = n
- 跳 2 步到 n:剩下的是第 n - 2 步沒跳,起始跳到第 n - 2 步設它爲 pre2 種
- 跳 1 步到 n:剩下的是第 n - 1 步沒跳,起始跳到第 n - 1 步設它爲 pre1 種
同時可以發現第 n 階的解法,只要用到 n - 1 和 n - 2 階是多少,其他的不用考慮,因此用兩個變量臨時存下來即可
dp(i) = dp(i-2) + dp(i-1)
class Solution {
public:
int jumpFloor(int target) {
if (target <= 2) return target;
int pre2 = 1, pre1 = 2, sum = 0;
for (int i = 3; i <= target; i ++)
{
sum = pre2 + pre1;
pre2 = pre1;
pre1 = sum;
}
return sum;
}
};