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 注意点
解法解法一:这道题是一题非常经典的DP题(拥有非常明显的重叠子结构)。爬到n阶台阶有两种方法:1. 从n-1阶爬上 2. 从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; } }; 小结
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |