一开始想到的是分类列举,那可太麻烦了,但是看到评论区的hxd居然真的有列举法的,给出的理由是当台阶数到达46,会出现溢出;所以列举出了45种情况哈哈哈哈
列举方法:
public int climbStairs(int n) {
int result = 0;
switch(n){
case 1: result = 1; break;
case 2: result = 2; break;
case 3: result = 3; break;
case 4: result = 5; break;
case 5: result = 8; break;
case 6: result = 13; break;
case 7: result = 21; break;
case 8: result = 34; break;
case 9: result = 55; break;
case 10: result = 89; break;
case 11: result = 144; break;
case 12: result = 233; break;
case 13: result = 377; break;
case 14: result = 610; break;
case 15: result = 987; break;
case 16: result = 1597; break;
case 17: result = 2584; break;
case 18: result = 4181; break;
case 19: result = 6765; break;
case 20: result = 10946; break;
case 21: result = 17711; break;
case 22: result = 28657; break;
case 23: result = 46368; break;
case 24: result = 75025; break;
case 25: result = 121393; break;
case 26: result = 196418; break;
case 27: result = 317811; break;
case 28: result = 514229; break;
case 29: result = 832040; break;
case 30: result = 1346269; break;
case 31: result = 2178309; break;
case 32: result = 3524578; break;
case 33: result = 5702887; break;
case 34: result = 9227465; break;
case 35: result = 14930352; break;
case 36: result = 24157817; break;
case 37: result = 39088169; break;
case 38: result = 63245986; break;
case 39: result = 102334155; break;
case 40: result = 165580141; break;
case 41: result = 267914296; break;
case 42: result = 433494437; break;
case 43: result = 701408733; break;
case 44: result = 1134903170; break;
case 45: result = 1836311903; break;
}
return result;
}
分析:观察上面给出的答案,可以得出结论dp[i] = dp[i-1] + dp[i-2]
。斐波那契的一般思路是从后往前看,比如想求n=7时的解,根据公式dp[i] = dp[i-1] + dp[i-2]
很容易就想到n=7时等于n=6时+n=5时,n=6和5又有n=5 + n=4和n=4 + n=3,这么一步步下去就是递归了。 但"Java"的做法是从前往后看的,第一位 i1=1,第二位 i2=2,那第三位呢,就是temp = i1+i2,然后让i2变成新的i1,就把i2赋值给i1,i2自己则变成下一位即temp,这样一步一步往后移,用while循环控制移动几次,最后输出结果就可以。
代码:
class Solution {
public int climbStairs(int n) {
if(n <= 3)
return n;
int dp1 = 1;
int dp2 = 2;
int i = 2;
int temp = 0;
while(i < n)
{
temp = dp1 + dp2;
dp1 = dp2;
dp2 = temp;
i++;
}
return temp;
}
}