🔥 LeetCode 热题 HOT 100:70 && 72

115 阅读2分钟

“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];
}