编程练习_跳台阶
/**
*题目:
*一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少
*种跳法。
*解析:
*用动态规划的思想分析可以得出本质是一个求斐波那契级数的问题,求斐波那契级数很简单,不用像动态规划一样开辟数组。迭代的向后计算即可:时间复杂度O(n),空间复杂度O(1);
*/
class Solution {
public:
int jumpFloor(int number) {
int f1=0,f2=1,f3;
if(number<=1)return 1;
for(int i=1;i<=number;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
};
题目加大难度:
/**
*题目:
*一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n
*级的台阶总共有多少种跳法。
*解析:
*根据上一个题目:青蛙只跳1或2可以得出是一个斐波那契问题,即a[n]=a[n-1]+a[n-2],
*那么能跳1,2,3个台阶时a[n]=a[n-1]+a[n-2]+a[n-3],......
*依次类推,能推出本题的a[n]=a[n-1]+a[n-2]+......+a[1];由此得出代码:
*/
class Solution {
public:
int jumpFloorII(int number) {
int *a=new int[number+1];
a[0]=1;
a[1]=1;
for(int i=2;i<=number;i++){
a[i]=0;
for(int j=i-1;j>=0;j--){
a[i]+=a[j];
}
}
return a[number];
}
};
/**
*但是上述代码时间复杂度达到O(n^2),空间复杂度也达到O(n),重新看一下上述结论:
*a[n]=a[n-1]+a[n-2]+......+a[1];..........................(1)
*a[n-1]= a[n-2]+......+a[1];..........................(2)
*两式相减可知:a[n]=2*a[n-1];
*所以代码进一步简化:
*/
class Solution {
public:
int jumpFloorII(int number) {
int f=1,fn=1;
for(int i=2;i<=number;i++){
fn=2*f;
f=fn;
}
return fn;
}
};

浙公网安备 33010602011771号