LeetCode 热题100道-Day09
最小路径
- 先把每条路径的总和求出来,再进行比较,选出最小的即可
class Solution {
public int minPathSum(int[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int rows = grid.length, columns = grid[0].length;
int[][] dp = new int[rows][columns];
dp[0][0] = grid[0][0];
for (int i = 1; i < rows; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < columns; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < columns; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][columns - 1];
}
}
爬楼梯
- 有几层楼梯我们就可以循环多少次,每次我们只能选择爬 1 个台阶或 2 个台阶,从而不断算出 r
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1, i = 1;
for (; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
编辑距离
- 给你两个单词,将单词 1 转换成单词 2 需要多少步操作
class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
if (n * m == 0) {
return n + m;
}
int[][] D = new int[n + 1][m + 1];
for (int i = 0; i < n + 1; i++) {
D[i][0] = i;
}
for (int j = 0; j < m + 1; j++) {
D[0][j] = j;
}
int left = 0, down = 0, left_down = 0;
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
left = D[i - 1][j] + 1;
down = D[i][j - 1] + 1;
left_down = D[i - 1][j - 1];
if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
left_down += 1;
}
D[i][j] = Math.min(left, Math.min(down, left_down));
}
}
return D[n][m];
}
}