动态规划问题
通俗易懂的理解
/*
* @lc app=leetcode.cn id=70 lang=java
*
* [70] 爬楼梯
*
* https://leetcode-cn.com/problems/climbing-stairs/description/
*
* algorithms
* Easy (43.63%)
* Total Accepted: 32K
* Total Submissions: 72.3K
* Testcase Example: '2'
*
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
*
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
*
* 注意:给定 n 是一个正整数。
*
* 示例 1:
*
* 输入: 2
* 输出: 2
* 解释: 有两种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶
* 2. 2 阶
*
* 示例 2:
*
* 输入: 3
* 输出: 3
* 解释: 有三种方法可以爬到楼顶。
* 1. 1 阶 + 1 阶 + 1 阶
* 2. 1 阶 + 2 阶
* 3. 2 阶 + 1 阶
*
*
*/
class Solution1 {
public int climbStairs ( int n) {
if ( n<= 0 ) return 0 ;
if ( n== 1 ) return 1 ;
if ( n== 2 ) return 2 ;
return climbStairs ( n- 1 ) + climbStairs ( n- 2 ) ;
}
}
import java. util. HashMap;
class Solution2 {
public int climbStairs ( int n) {
if ( n<= 0 ) return 0 ;
if ( n== 1 ) return 1 ;
if ( n== 2 ) return 2 ;
HashMap< Integer, Integer> mem_map = new HashMap < Integer, Integer> ( ) ;
if ( mem_map. containsKey ( n) ) {
return mem_map. get ( n) ;
} else {
int val = climbStairs ( n- 1 ) + climbStairs ( n- 2 ) ;
mem_map. put ( n, val) ;
return val;
}
}
}
class Solution3 {
public int climbStairs ( int n) {
if ( n<= 0 ) return 0 ;
if ( n== 1 ) return 1 ;
if ( n== 2 ) return 2 ;
int a = 1 ;
int b = 2 ;
int temp = 0 ;
for ( int i = 3 ; i <= n; i++ ) {
temp = a + b;
a = b;
b = temp;
}
return temp;
}
}