Week 08 - Leetcode 71 - 80

71 - 简化路径

模拟题, 这里相当于把string 当栈来用,遇到.. 就把上一个name弹出来;

class Solution {
public:
    string simplifyPath(string path) {
        string res, name;
        if(path.back() != '/') path += '/';
        for(auto c : path)
        {
            if(c != '/') name += c;
            else
            {
                if(name == "..")
                {
                    while(res.size() && res.back() != '/') res.pop_back(); // 除去上一个name
                    if(res.size()) res.pop_back(); // 除去 /
                }
                else if (name != "." && name.size())
                    res += '/' + name;     // 加在结果里
                name.clear();
            }
        }
        if(res.empty()) return "/"; // 如果res为空 -> 处于根目录
        else return res;
    }
};

72 - 编辑距离

经典的动态规划问题了;

f[i][j] 表示 a[1..i] 到 b[1..j] 按顺序操作的最短编辑距离

  1. 不会有多余操作

  2. 操作顺序不会影响答案

删除 f[i - 1, j] + 1 添加 f[i, j - 1] + 1 替换 f[i - 1, j - 1] + 0 / 1 (取决于a[i]b[j]是否相等)

初始化要稍微注意一下;

73 - 矩阵置0

行列互相影响 -> 先开两个数组去记录行 列是否出现过0, 然后再遍历一次赋值就好;这里的空间复杂度是o(m + n)

对于本题的常数空间,实际上就是利用原数组去记录;

用第一行去记录每一列是否出现过0, 第一列去记录每一行是否出现过0; 而第一行和第一列是否出现过0可以用额外的两个变量记录;

这样就保证了常数空间; avatar

空间:o(n + m)

空间:o(1)

74 - 搜索二维矩阵

这题把这个矩阵抻长了就是一个单调上升的序列,所以直接二分就好了; 二维坐标的映射 i * m + j0 - (n * m - 1) 映射到二维坐标

75 - 颜色分类

荷兰国旗问题

和快排的那个partition是一个思路的,复习一下快排;

这里是三路快排的应用,方法如下:

avatar

76 - 最小覆盖子串

这题的思路和30题有点像的 都是滑动窗口 + 哈希;

如何判断窗口内元素是否符合要求:

增加: if(window[c] <= hash[c]) 删除: while(window[c] > hash[c])

77 - 组合

对于按组合数搜索的问题,重要的点在于如何判重:

[1, 3][3, 1] 这种由于搜索顺序导致的重复,可以通过限制顺序 来解决;

限制只能从小到大搜 不能搜完3再回过头搜1, 这样就可以完成去重;

dfs的时候除了传入次数u,还要传入上一个搜到的元素i, 后面直接从i + 1 开始搜;

78 - 子集

递归子集:枚举每个点 选 or 不选

相较于这样的递归的做法,枚举子集更重要的方式:二进制枚举

每一个二进制数,表示选 or 不选; 从0枚举到 2^n - 1

举例来说 010 -> [2], 101 -> [1, 3]

79 - 单词搜索

简单搜索题

80 - 删除排序数组中的重复项ii

和上一个删除重复项的题很像 都是用双指针过滤不合法情况

Last updated