2021-08 Leetcode刷题记录


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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值