剑指offer-JZ9
跳台阶扩展问题
https://www.nowcoder.com/practice/22243d016f6b47f2a6928b4313c85387?tpId=13&tqId=11162&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tab=answerKey
c++
考查斐波那契数列的变种,
第n级 = f[n-1]+f[n-2]+......f[0]
三种思路:暴力、递归、 动态规划、
思路一,暴力法:
class Solution {
public:
int jumpFloorII(int number) {
if (number ==0 || number==1) return 1;
vector<int> f(number+1, 0);
f[0]=1;
f[1]=1;
for (int i =2; i<=number; i++){
for (int j=0; j<i; j++){
f[i]=f[i]+f[j];
}
}
return f[number];
}
};继续优化:
第n级
第n-1级
所以:
继续有一下推论:
应该是
暴力法2:
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0 || number == 1) return 1;
int ans=1;
for(int i=2; i<=number; i++){
ans = ans << 1;
}
return ans;
}
};或者直接计算:
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0 || number == 1) return 1;
return pow(2,number-1);
}
};思路二,递归法:
class Solution {
public:
int jumpFloorII(int number) {
if (number ==0 || number ==1) return 1;
int ans = 0;
while(number>=0){
number--;
ans = ans + jumpFloorII(number);
}
return ans;
}
};这里需要重复计算,因此加入记忆,存储已经计算过的;
class Solution {
public:
int Fib(int n, vector<int> &dp){
if (n==0 ||n==1) return 1;
if (dp[n] != 0) return dp[n];
int temp =n;
while(temp>=0){
temp--;
dp[n]= dp[n] + Fib(temp, dp);
}
return dp[n];
}
int jumpFloorII(int number) {
vector<int> dp(number+1, 0);
return Fib(number, dp);
}
};递归法2,利用推导公式:
class Solution {
public:
int jumpFloorII(int number) {
if(number == 0 || number == 1) return 1;
return jumpFloorII(number-1)*2;
}
};
