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] 按顺序操作的最短编辑距离
不会有多余操作
操作顺序不会影响答案
删除 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可以用额外的两个变量记录;
这样就保证了常数空间; 
空间:o(n + m)
空间:o(1)
74 - 搜索二维矩阵
这题把这个矩阵抻长了就是一个单调上升的序列,所以直接二分就好了; 二维坐标的映射 i * m + j 从0 - (n * m - 1) 映射到二维坐标
75 - 颜色分类
荷兰国旗问题
和快排的那个partition是一个思路的,复习一下快排;
这里是三路快排的应用,方法如下:

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