宝剑锋从磨砺出,梅花香自苦寒来!
1. 感染二叉树需要的总时间 ✘
- 深度优先搜索将二叉树转换为无序图(用于确定一个节点邻近节点的关系)
- 广度优先搜索计算最长距离
std::unordered_map<int, std::vector<int>> table;
std::function<void(TreeNode*)> dfs = [&](TreeNode* parent) {
for (auto& child : std::vector<TreeNode*>{parent->left, parent->right})}{
if(child == nullptr)
continue;
table[parent->val].push_back(child->val);
table[child->val].push_back(parent->val);
dfs(child);
}
};
dfs(root);
1. 总行驶距离 ✔
1. 快照数组 ✔
auto x = std::upper_bound(snaps_[index].begin(), snaps_[index].end(), std::make_pair(snap_id + 1, -1));
return x == snaps_[index].begin() ? 0 : std::prev(x)->second;
1. 查询网格图中每一列的宽度 ✔
1. 负二进制转换 ✔
1. 将矩阵按对角线排序 ✔
1. 满足目标工作时长的员工数目 ✔
1. 雇佣 K 位工人的总代价 ✔
1. 雇佣 K 名工人的最低成本 ✔
1. 去掉最低工资和最高工资后的工资平均值 ✔
template<class Input, class T, class BinaryOp>
T accumulate(Input first, Input last, T init, BinaryOp op);
1. 规划兼职工作 ✖
动态规划+二分查找(std::upper_bound)
1. 拆炸弹 ✔
1. 摘樱桃 ✔
1. 二分查找 ✔
1. 移除元素 ✔
1. 有序数组的平方 ✔
1. 长度最小的子数组 ✔
1. 螺旋矩阵II ✔
1. 移除链表元素 ✔
1. 设计链表 ✔
1. 反转链表 ✔
1. 两两交换链表中的节点 ✔
1. 删除链表的倒数第 N 个结点 ✔
双指针解决长度未知问题:
- 先让快指针走
n
步 - 同时让快指针慢指针运动,当快指针走到末尾时,满指针所指位置即为要求的节点
1. 链表相交 ✔
1. 环形链表 II ✖
1. 有效的字母异位词 ✔
1. 两个数组的交集 ✔
1. 快乐数 ✔
1. 两数之和 ✔
2. 四数相加 II ✔
1. 赎金信 ✔
2. 三数之和 ✖
利用排序进行去重。
1. 四数之和 ✖
2. 反转字符串 ✔
1. 反转字符串 II ✔
2. 反转字符串中的单词 ✔
3. 找出字符串中第一个匹配项的下标 ✔
4. 重复的子字符串 ✖
1. 用栈实现队列 ✔
2. 用队列实现栈 ✔
3. 有效的括号 ✔
1. 删除字符串中的所有相邻重复项 ✔ 2. 逆波兰表达式求值 ✔
1. 滑动窗口最大值 ✖
2. 前K个高频元素 ✔
1. 二叉树的前序遍历 ✔
2. 二叉树的后序遍历 ✔
3. 二叉树的中序遍历 ✔
1. 二叉树的前序遍历 ✔ 2. 二叉树的中序遍历 ✔ 3. 二叉树的后序遍历 ✖
1. 二叉树的层序遍历 ✔ 2. 二叉树的层序遍历 II ✔
1. 二叉树的右视图 ✔ 2. 二叉树的层平均值 ✔
1. N 叉树的层序遍历 ✔ 2. 在每个树行中找最大值 ✔
1. 填充每个节点的下一个右侧节点指针 ✔ 2. 填充每个节点的下一个右侧节点指针 II ✔
1. 二叉树的最大深度 ✔ 2. 二叉树的最小深度 ✔
1. 翻转二叉树 ✔ 2. 对称二叉树 ✔
1. 二叉树的最大深度 ✔ 2. 二叉树的最小深度 ✔
1. 完全二叉树的节点个数 ✔
1. 二叉树的所有路径 ✔
1. 左叶子之和 ✔