加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Climbing Stairs - LeetCode

发布时间:2020-12-14 04:24:45 所属栏目:大数据 来源:网络整理
导读:目录 题目链接 注意点 解法 小结 题目链接 Climbing Stairs - LeetCode 注意点 必须要初始化pre 解法 解法一:这道题是一题非常经典的DP题(拥有非常明显的重叠子结构)。爬到n阶台阶有两种方法:1. 从n-1阶爬上 2. 从n-2阶爬上。很容易得出递推式: f(n) = f(

目录

  • 题目链接
  • 注意点
  • 解法
  • 小结

题目链接

Climbing Stairs - LeetCode

注意点

  • 必须要初始化pre

解法

解法一:这道题是一题非常经典的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,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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读