文章目录
1.爬楼梯⭐
维护数组 dpi 表示:爬到第 i 阶楼梯,一共有多少种方法
- 如何到达第 i 阶,只能有两种情况
dp[i] = dp[i-1] + dp[i-2]- 从第 i-1 阶走一步
- 从第 i-2 阶走两步
- 初始时 dp0=1 (从第0阶出发到第0阶),dp1=1,dp2=dp0 + dp1=2,以此类推
- 注意0代表一层,dpi+1
java
public int climbStairs(int n) {
if(n <3) return n;
int[]dp = new int[n+1];
//0层表示0步骤
//dp[n]表示到达了第n层
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
- 时间复杂度 O(n)
2.杨辉三角
- 每一层的长度 len = i+1
- dpnn,dpn0 = 1,dpnlen = 1
- dpij = dpi-1j-1+ dpi-1j
bash
n=5
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
java
public static List<List<Integer>> generate(int numRows) {
//每一行的数字个数
int n = 1;
List<List<Integer>> list = new ArrayList<>();
int[][] dp = new int[numRows][numRows];
for(int i = 0; i < numRows; i++){
//每层需要初始化tmp
List<Integer> tmp = new ArrayList<>();
for(int j = 0; j <= i; j++){
//头和尾
if(j == 0 || j == i){
dp[i][j] = 1;
tmp.add(1);
}else {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
tmp.add(dp[i][j]);
}
}
//加入list
list.add(tmp);
}
return list;
}
- 在原list上进行修改
java
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> result = new ArrayList<>();
for(int i = 0; i < numRows; i++){
List<Integer> row = new ArrayList<>();
// 当前行有 i+1 个数字
for(int j = 0; j <= i; j++){
// 两边都是1
if(j == 0 || j == i){
row.add(1);
}else{
// 中间位置
int value =
result.get(i-1).get(j-1)
+
result.get(i-1).get(j);
row.add(value);
}
}
result.add(row);
}
return result;
}
3.打家劫舍
dpi 表示:偷窃前 i+1 间房屋,可以获得的最大金额。