算法题之Climbing Stairs(leetcode 70)
题目:
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
Approach #1 Brute Force [Time Limit Exceeded]
public class Solution {
public int climbStairs(int n) {
climb_Stairs(0, n);
}
public int climb_Stairs(int i, int n) {
if (i > n) {
return 0;
}
if (i == n) {
return 1;
}
return climb_Stairs(i + 1, n) + climb_Stairs(i + 2, n);
}
}
Time complexity : O(2^n). Size of recursion tree will be 2^n.
Space complexity : O(n). The depth of the recursion tree can go upto n.
Approach #2 Recursion with memorization [Accepted]
public class Solution {
public int climbStairs(int n) {
int memo[] = new int[n + 1];
return climb_Stairs(0, n, memo);
}
public int climb_Stairs(int i, int n, int memo[]) {
if (i > n) {
return 0;
}
if (i == n) {
return 1;
}
if (memo[i] > 0) {
return memo[i];
}
memo[i] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo);
return memo[i];
}
}
Time complexity : O(n). Size of recursion tree can go upto n.
Space complexity : O(n). The depth of recursion tree can go upto n.
Approach #3 Dynamic Programming [Accepted]
public class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
Time complexity : O(n). Single loop upto n.
Space complexity : O(n). dp array of size n is used.
Approach #4 Fibonacci Number [Accepted]:
public class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
int first = 1;
int second = 2;
for (int i = 3; i <= n; i++) {
int third = first + second;
first = second;
second = third;
}
return second;
}
}
Time complexity : O(n). Single loop upto n is required to calculate n^{th} fibonacci number.
Space complexity : O(1). Constant space is used.
原文:https://leetcode.com/articles/climbing-stairs/
最新文章
- python 中文编码问题
- 《K&;R》里贯穿全书的代码
- C#中的var类型
- iOS 开发之照片框架详解(3)
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
- url 编码(percentcode 百分号编码)
- 【Todo】各种排序整理
- HDU1007最近点对(分治)
- Git CMD - tag: Create, list, delete or verify a tag object signed with GPG
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
- 在Mac OS X中搭建STM32开发环境(1)
- Keepalived实现Redis Failover
- 读书笔记:java并发
- sql 中的 indexOf 与 lastIndexOf
- firebug使用
- Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式
- Flutter环境搭建
- IntelliJ IDEA 注册码 (秘钥)
- 配置Tomcat配置路径
- 分布式理论(五)—— 一致性算法 Paxos