zoukankan      html  css  js  c++  java
  • Climbing Stairs

    题目链接

    Climbing Stairs - LeetCode

    注意点

    • 注意边界条件

    解法

    解法一:这道题是一题非常经典的DP题(拥有非常明显的重叠子结构)。爬到n阶台阶有两种方法:1. 从n-1阶爬上 2. 从n-2阶爬上。很容易得出递推式:f(n) = f(n-1)+f(n-2)于是可以得到下面这种最简单效率也最低的解法 —— 递归。

    class Solution {
    public:
        int climbStairs(int n) {
            if(n == 0 || n == 1 || n == 2)
            {
                return n;
            }
            return climbStairs(n-1)+climbStairs(n-2);
        }
    };
    

    解法二:思路不变,改为更高效的写法 —— 迭代。时间复杂度O(n)。

    class Solution {
    public:
        int climbStairs(int n) {
            vector<int> ans;
            int i;
            for(i = 0;i <= 2;i++)
            {
                ans.push_back(i);
            }
            for(i = 3;i <= n;i++)
            {
                ans.push_back(ans[i-1]+ans[i-2]);
            }
            return ans[n];
        }
    };
    

    解法三:继续优化,可以看出解法二中需要开一个额外的数组来保存过程中计算的值,这些值计算完之后就没用了,所以改用两个变量来替代。时间复杂度O(n),空间复杂度O(1)

    class Solution {
    public:
        int climbStairs(int n) {
            if(n == 0||n == 1||n == 2)
            {
                return n;
            }
            int a = 2,b = 1,i;
            for(i = 0;i < n-2;i++)
            {
                a = a+b;
                b = a-b;
            }
            return a;
        }
    };
    

    或者一个更好理解的

    class Solution {
    public:
        int climbStairs(int n) {
            if(n == 0||n == 1||n == 2)
            {
                return n;
            }
            int a = 2,b = 1,ret,i;
            for(i = 0;i < n-2;i++)
            {
                ret = a+b;
                b = a;
                a = ret;
            }
            return ret;
            
        }
    };
    

    小结

    • 这道题可以扩展到每次可以走k步,那递推式就变为f(n) = f(n-1) + f(n-2) + ... + f(n-k)
  • 相关阅读:
    swift
    swift
    ios
    Swift
    swift
    swift
    /var/log/cron
    Django 数据传递
    HTML 属性
    HTML 元素
  • 原文地址:https://www.cnblogs.com/multhree/p/10369596.html
Copyright © 2011-2022 走看看