LeetCode笔记:70. Climbing Stairs

问题:

You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

大意:

你在爬一个楼梯。需要n节楼梯到达顶部。
每次你可以爬一节或者两节楼梯。你总共有多少种爬到顶部的方法?

思路:

总觉得这个题目小时候做过。一开始想着找找规律,按照全程走一个两节的、两个两节的、三个两节的这么去算,列了一下算式发现并没有什么规律。。。
后来想我每到一节都面临两个选择,即走一节还是走两节,于是想到用递归去做,不断返回在某一节为止走两节和走一节的走法数量之和。按照这种方法做了之后,一开始是能够解决的,测试到了44节楼梯的时候,就超时了,看了看答案给出的总走法数,确实是一个很大的数字,用递归要算的太多了。
既然往后面的走法去算走不通,那就往前看,我每来到一节新的位置的走法数量都是到上一节位置的走法数加上到上两节位置的走法数之和,一个是走一节楼梯到当前节,一个是走两节楼梯到当前节,这样从第二节开始去计算(第一节明显是一种走法,第二节开始才可以计算两节以前的位置走法数(即处于0位置时,设其为1)加上一节以前的位置走法数(即处于1位置时,设其为1)。)走到第二节的走法之和,慢慢算到最后一层。这里用一个数组去计算每一层的走法数。当然如果要节省空间也可以就用三个变量,只是每次去改变其值就可以了。

代码(Java):

public class Solution {
    public int climbStairs(int n) {
        int[] result = new int[n+1];
        result[0] = 1;
        result[1] = 1;
        for (int i = 2; i <= n; i++) {
            result[i] = result[i-1] + result[i-2];
        }
        return result[n];
    }
}

代码(C++)

三个变量轮换记录:

class Solution {
public:
    int climbStairs(int n) {
        if (n == 1) return 1;
        else if (n == 2) return 2;

        int a = 1, b = 2;
        int i = 3;
        int res = 0;
        while (i <= n) {
            res = a + b;
            a = b;
            b = res;
            i ++;
        }
        return res;
    }
};

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首页

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这几天我写了很多日记,得到了多人的赞赏。 写日记有很多好处,它能记录我美好的童年中发生的事情,还有...
    皓皓_f9d7阅读 4,394评论 1 2
  • 出了皇城相府,就有九女仙湖的车,我和妈妈欣然上座,但没想到这车竟不能直达目的地,说是不远了但也不知道是到了哪里,于...
    水晶糖__想把我写给你听阅读 3,430评论 0 2
  • 一、仙使初来 这个世界有神吗?有鬼吗?我只能说不知道!因为没看见过也没摸到过。 那么这个世界有仙吗...
    塰謿阅读 4,574评论 0 5
  • 9月6日晚上信用卡中心钟智红参加常福支行夕会,讲解了大学生信用卡的填表规则和相关权益,分享其他网点外拓营销...
    a539b9bb30fe阅读 3,858评论 0 0

友情链接更多精彩内容