ref:
https://www.cnblogs.com/grandyang/default.html?page=2
https://hk029.gitbooks.io/leetbook/content/
计时统计:题目,算法,编码,调试,优化
must:
明确变量含义
逻辑场景覆盖
check:
状态初始化、更新与还原
边界条件:max/min初始化边界flag直接作为结果含义转换
累加等溢出 INT_MIN LONG_MIN
opt:
关键注释
剪枝尽早提升性能
2021.08.06
315. 计算右侧小于当前元素的个数
题解:https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/solution/shu-zhuang-shu-zu-by-liweiwei1419/
https://leetcode-cn.com/problems/count-of-smaller-numbers-after-self/solution/c-xian-duan-shu-jie-fa-by-dufre/
2021.08.05
493. 翻转对[H]
tag: 分治 归并 图示 有序单调复杂度优化
题解:https://leetcode-cn.com/problems/reverse-pairs/solution/cjavapython3-gui-bing-pai-xu-by-yanghk/
K:
1、二维有序遍历O(m*n),画图可以看到有蕴含(推出)关系,不需要双层每次都从头循环,可以通过有序单调关系,只往一个方向走到头,从而将为O(m+n);
2、condition break
3、int mid = left + (right-left) / 2; 防止越界
4、溢出 if ((long)a[p1] > 2 * (long)a[p2])
4、归并排序
void merge_re(vector<int> &a, vector<int> &b, int l, int r) {
if (l >= r) {
return;
}
// int mid = (l + r) / 2;
int mid = l + (r - l) / 2;
merge_re(a, b, l, mid);
merge_re(a, b, mid + 1, r);
int p1 = l;
int p2 = mid + 1;
int p = l;
while (p1 <= mid && p2 <= r) {
if (a[p1] < a[p2]) {
b[p++] = a[p1++];
} else {
b[p++] = a[p2++];
}
}
while (p1 <= mid) {
b[p++] = a[p1++];
}
while (p2 <= r) {
b[p++] = a[p2++];
}
for (int i = l; i <= r; i++) {
a[i] = b[i];
}
}
void merge(vector<int> &a) {
int size = a.size();
vector<int> b(size);
merge_re(a, b, 0, size - 1);
}
2021.08.04
238. 除自身以外数组的乘积
tag:递归 备忘录
解题:将结果拆分成L*R,每个子计算,计算每一个节点值是上一个节点的状态基础上加一个操作,即可以To(n)搞定;
注意:要明确L[i]的含义,指的是i之前所有左值的乘积;
K:枚举、搜索、+递归、分治、贪心、动规
转化、数据结构
2021.08.03
863. 二叉树中所有距离为 K 的结点
tag: tree dfs bfs graph
解题:将树构造父子节点的图,再bfs搜一遍
注意:
双向图要排除已遍历的点
make_tuple(target, 0, nullptr)
std::get<1>(temp)
K:链式前向星+存图
2021.08.02
4. 寻找两个正序数组的中位数
tag: 二分 topk
1)sort(n+m) T:(m+n)log(m+n) S:m+nlog
2)2point T: (m+n)/2 S:O1
3)二分
找mid,可以泛化问题为找topk
两个数组找topk,每次cut掉多少?
假设k是10:
每个子数组各cut1,两个cut掉的总量是2,扔到最小的cutA丢一个元素,不会扔掉top10,不会丢待寻找的元素;
继续增加,2也是可以的
如果各cut6,那两个cut掉12个,如果把最小的。。。。todo
【原理】比小的中位数小的最对有x个,x<k,那小的肯定不是topk,小的之前的都可以删除掉;每次最大取k/2,小的可以一个一个删除,单不是最高效
2021.07.22
08.13. 堆箱子
960. 删列造序 III
2021.07.21
673. 最长递增子序列的个数
2021.07.19
300. 最长递增子序列
#include <algorithm>
*max_element(endAndIncrease.begin(), endAndIncrease.end());
646. 最长数对链
2021.07.19
435. 无重叠区间
vector<vector<int>> intervals;
sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
return u[1] < v[1];
});
2021.07.15
22. 括号生成
11. 盛最多水的容器 --数学证明
2021.07.14
17. 电话号码的字母组合
2021.07.12
547. 省份数量
2021.07.08
34. 在排序数组中查找元素的第一个和最后一个位置
2021.07.07
15. 三数之和
2021.07.06
726. 原子的数量
207. 课程表 20210604
题目 1048-1051
算法+编码 1051-1105=18
调试 1706-1720=14
优化 1720-1730=10
98. 验证二叉搜索树 20210603 51min
题目 1125-1126=1
算法+编码 1126-1146=20
调试 1146-1201=15
优化 15
200. 岛屿数量 20210603 45min
题目 1645-1648=3
算法+编码 1648-1706=18
调试 1706-1720=14
优化 1720-1730=10
124. 二叉树中的最大路径和 20210531 1017
计时统计:
题目, 1011-1017=6
算法 1017-1107=40
编码 1425-1437= 12
调试 1437-1517=40
112. 路径总和 20120529 1124-1140=16
计时统计:
题目,算法 1124-1132=8
编码 1132-1139=7
调试 0
113. 路径总和 II 20120529 1146--1537=58
计时统计:
题目,算法 1146-1152=6
编码 1425-1437= 12
调试 1437-1517=40
111. 二叉树的最小深度 20120528 1522-1546=26