“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
70. 爬楼梯
一、题目描述:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入: n = 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2.
二、思路分析:
- 动态规划
到达第 i 层的方式有两种, 一是从 i - 1 层爬一个台阶到第 i 层, 二是 从 i - 2 层爬两个台阶到达第 i 层
状态转移 dp[i] = dp[i - 1] + dp[i - 2]
三、AC 代码:
public int climbStairs(int n) {
if(n == 1 || n == 2) return n;
int a = 1;
int b = 2;
int ans = 0;
for(int i = 3;i <=n;i++){
ans = a + b;
a = b;
b = ans;
}
return ans;
}
72. 编辑距离
一、题目描述: 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符 删除一个字符 替换一个字符
示例 1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')
二、思路分析:
- 动态规划 dp[i][j] 代表 word1 中 0 - i 之间的字符串 转化为 word2中 0 - j 之间字符串的最小操作数
word1[i] == word[2] 时 : dp[i][j] = dp[i - 1][j - 1]
word1[i] != word[2] 时 : 考虑删除,添加,替换三种操作, 取最小值
dp[i - 1][j - 1] : 替换操作, 将 i 位置的字符转为为 j位置的字符
dp[i - 1][j] : 删除操作, 删除 i 位置的字符
dp[i][j - 1] : 添加操作, 在i 后面添加字符,匹配 j 位置的字符
三、AC 代码:
public int minDistance(String word1, String word2) {
word1 = " " + word1;
word2 = " " + word2;
char[] c1 = word1.toCharArray();
char[] c2 = word2.toCharArray();
int n = c1.length, m = c2.length;
int[][] dp = new int[n][m];
dp[0][0] = c1[0] == c2[0] ? 0 : 1;
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i - 1][0] + 1;
}
for (int j = 1; j < m; j++) {
dp[0][j] = dp[0][j - 1] + 1;
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (c1[i] == c2[j]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(Math.min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i][j - 1]) + 1;
}
}
}
return dp[n - 1][m - 1];
}