声明:以下练习题目均来自于https://leetcode-cn.com/
目录
0.一维动态规划
- 动态规划都需要把之前的值存起来,即子问题的解存起来
- 使用一维数组存储起来之前的值,即为一维动态规划
1.爬楼梯
1.1 问题描述
1.2 分析
- 对于每层台阶i,前一步只可能有两种情况:
- 在i-2层,爬2阶到i层
- 在i-1层,爬1阶到i层
1.3 列表
台阶总数 | 1 | 2 | 3 | 4 | 5 | 6 |
方法数 | 1 | 2 | 3 | 5 | 8 | 13 |
1.4 公式
- methodNum[i] = methodNum[i-2] + methodNum[i-1];
1.5 代码实现
package dynamic.climbStairs;
public class ClimbStairs {
/**
* 爬楼梯
* @param stairNum 楼梯阶数
* @return 爬楼梯的方法数
*/
public int climbStairs(int stairNum){
//输入的n非法时,返回0
if(stairNum <= 0)
return 0;
//只有1层台阶时,只有1种方法
if(stairNum == 1)
return 1;
//初始化第1,2层台阶的方法数量(保证下面的递推公式中不会越界)
int prev_2_methodNum = 1; //当前台阶的前2个台阶
int prev_1_methodNum = 2; //当前台阶的前1个台阶
//初始化当前台阶的方法数为第二层台阶的方法数
int curr_methodNum = prev_1_methodNum;
//从第3层台阶开始遍历,通过递推公式计算得到最终的方法数
for (int i = 2; i < stairNum; i++) {
curr_methodNum = prev_1_methodNum + prev_2_methodNum;
//为下一次计算,迭代新的值
prev_2_methodNum = prev_1_methodNum;
prev_1_methodNum = curr_methodNum;
}
return curr_methodNum;
}
}
已测试通过:
- 效率分析:
- 时间复杂度为:O(n)
- 空间复杂度为:O(1)
2.打家劫舍
2.1 问题描述
2.2 分析
- 对于每个房子