LeetCode第77题: 爬楼梯climbStairs(C语言)

思路1:最自然的思路应该是穷举思路要放弃,新建一个数组用于储存n从0到n-1的所有可能情况,对于n,第一步只有两种走法,走一步或者走两步,而a[n-1]和a[n-2]都是提前求好的,所以直接带入求和即可

int climbStairs(int n){
    if(n < 3)
        return n;
    int *a = (int *)malloc((n + 1)* sizeof(int));
    a[0] = 0;
    a[1] = 1;
    a[2] = 2;
    for(int i = 3; i <= n; i++){
        a[i] = a[i-1] + a[i-2];
    }
    return a[n];
}

思路2:对于思路1中的数组,实际上我们只需要知道n之前的两个数字就可以了,不需要记录从0-n的所有数字,所以维护两个变量就可以了。

int climbStairs(int n){
    if(n < 3)
        return n;
    int first = 1;
    int second = 2;
    int result = 0;
    for(int i = 3; i <= n; i++){
        result = first + second;
        first = second;
        second = result;
    }
    return result;
}

思路3:对于要记录的两个数,实际上可以直接递归,可惜提交的时候会报超时 saaaaaad

int climbStairs(int n){
    if(n < 3)
        return n;
    return climbStairs(n-1) + climbStairs(n-2);
}

本系列文章,旨在打造LeetCode题目解题方法,帮助和引导同学们开阔学习算法思路,由于个人能力和精力的局限性,也会参考其他网站的代码和思路,如有侵权,请联系本人删除。

你可能感兴趣的:(LeetCode第77题: 爬楼梯climbStairs(C语言))