Leetcode 70-爬楼梯
以下是爬楼梯问题的三种解法,三种解法的本质都是将大问题拆解成为小问题,比如说如果还有二十层台阶,那么如何走完20层呢?可以一步走两个台阶,也可以一步走一个台阶,所以说时19阶的全部可能+18阶的全部可能。
新手入门,大佬勿喷~
简单的递归
这是第一种方法,直接递归,直接递归无法通过测试,当数据样本等于45时,会显示超时。
public:
int climbStairs(int n)
{
if (n == 1 || n == 2)return n;
return climbStairs[n-1]+climbStairs[n-2];
}
};
记忆化搜索
这是第二种方法,递归的改进方案——记忆化搜索,将递归过程中计算出来的量记录一下,再下次需要返回相同的量时不再重复计算,而是直接调用。
public:
int map[46];
int climbStairs(int n)
{
if (n == 1 || n == 2)
return n;
if (map[n] != 0)
{
return map[n];
}
else
{
map[n] = climbStairs(n - 1) + climbStairs(n - 2);
return map[n];
}
}
};
for循环
理论上来说,递归能解决的问题都可以转化成for循环来解决。
class Solution
{
public:
int climbStairs(int n)
{
if(n==1||n==2)return n;
int result = 0;
int pre = 2;//前一个元素
int prePre=1;//前一个元素的前一个元素
for(int i=3;i<=n;i++)
{
result=pre+prePre;
prePre=pre;
pre=result;//相互赋值
}
return result;
}
};