/** *题目: *一只青蛙一次可以跳上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; } };
时间: 2024-10-14 09:12:29