leetcode 每日一题 70. Climbing Stairs
来源:互联网 发布:帝国时代2mac中文版 编辑:程序博客网 时间:2024/05/29 16:15
虽然标记是动态规划。但是其实感觉大家都会用递归,但是递归会超时。
这时发现可以使用一维数组去做,比较简便好理解。
有n个台阶,每次走一步或者两步,问多少种方法走完。
用动态规划的想法去想,从n开始倒着数,发现可以使用n-1+1或者n-2+2这两种方式走完整个台阶。
因此n的次数=n-1台阶可能的走法+n-2台阶可能的走法
举个例子:
n=1时,1种走法
n=2时,2种走法,11和2
n=3时,3种走法,即111和12和21,也就是n=1种走法(最后再走一步2台阶) 与 n=2种走法(最后再走一步1台阶)的和
由此可得代码,
class Solution {public: int climbStairs(int n) { int climb[10001]={0}; if(n==0) return 0; for(int i=1;i<=n;i++){ if(i==1) climb[i]=1; else if(i==2) climb[i]=2; else climb[i]=climb[i-1]+climb[i-2]; } return climb[n]; }};
如果不用一维数组可能有些不好理解,
非递归的方式,其实此题类似于求斐波那契数列的和,但是递归不仅慢还可能溢出。下面采用非递归的方法,其中pre代表前n-1台阶的方法数,current代表第n台阶的方法数。
public int climbStairs(int n) { if (n == 0 || n == 1) return 1; int pre = 1; int current = 1; for (int i = 2; i <= n; i++) { int temp = current + pre; pre = current; current = temp; } return current; }
这种方法降低了空间复杂度,然而时间还是一样~
另外,动态分配数组的方法也可以借鉴,但是其实比较慢。
int *count=new int[n+1];
0 0
- leetcode 每日一题 70. Climbing Stairs
- leetcode:70 Climbing Stairs-每日编程第十五题
- [LeetCode]70.Climbing Stairs
- LeetCode --- 70. Climbing Stairs
- [Leetcode] 70. Climbing Stairs
- [leetcode] 70.Climbing Stairs
- [leetCode]70. Climbing Stairs
- 70. Climbing Stairs LeetCode
- [LeetCode]70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- leetcode 70. Climbing Stairs
- leetcode 70. Climbing Stairs
- LeetCode *** 70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- LeetCode 70. Climbing Stairs
- leetcode 70. Climbing Stairs
- [LeetCode]70. Climbing Stairs
- 【LeetCode】70. Climbing Stairs
- Apache 配置 WebSocket 协议
- 【ZOJ3921 2016年浙大2月月赛L】【随机化 答案猜解】Parity Modulo P 大数mod大数mod2
- Monkey测试
- Android开发艺术探索小记(第十四章)
- 详解zabbix安装部署(Server端篇)
- leetcode 每日一题 70. Climbing Stairs
- 面向对象——类设计(四)
- OC 成员变量和属性的区别 .
- 一个内存泄漏引发的血案
- String a; String a=null; Sting a="" ;String a="b";区别
- zabbix监控系统客户端安装
- 【Wunder Fund Round 2016 (Div 1 + Div 2 combined)A】【二进制拆分】Slime Combining 特殊规则二进制拆分
- C++虚析构函数、纯虚析构函数
- Android Contacts 联系人源码分析