0. 概要
leecode每日一题(也可能多题)题解跟踪记录及总目录。
常用算法解题思路和技巧及数据结构:
- 预处理:数组排序(954),哈希表。。。
- 双指针法 682,125,905
- 单向链表 2
- 双向链表
- 栈 388,591
- 哈希方法:凡是涉及大量查询处理的问题都可以考虑哈希方法,在python中可以用dict和set,查询效率比list查询高几个数量级
- 动态规划 64
- 深度优先搜索 733, 695,797,1306,365,886,785
- 广度优先搜索, 429, 733, 200, 695,1129,1306,1654,433,752
- 多源广度优先搜索 1162,847
- 双向广度优先搜索 127
- 递归,427
- 滑动窗,28,661
- 迭代 2104,7, 396
- padding以简化边界处理,1144
- 有限状态机 8,122
- 数学 2028, 365
- 模拟 1606
- 有序数组 1606
- 优先队列 1606
- 线段树 307
- 二分法 744
- 拓扑排序 310, 802
- 树 145, 590, 589, 429, 1305,1022,450
- 并查集 547
- 状态压缩 847
- 字典树 386,440
- 二分图 886,785
- 凸包 587
- 水池抽样 398
- 数据结构: 380
1. 学习计划广场
1.1 图论基础
733,200,695,1254,1020,1905,1162,417,1091,542,934,1926, 797,841,547,1319,1376,802,1129,847,1306,1654,365,433,752,127,997,1557,1615,886,785
1.2 动态规划入门
Leetcode学习计划之动态规划入门day1,2(共4题,509,1137,70,746)
Leetcode学习计划之动态规划入门day3(198,213,740)
Leetcode学习计划之动态规划入门day4(55,45)
Leetcode学习计划之动态规划入门day5(53,918)
Leetcode学习计划之动态规划入门day6(152, 1567)
Leetcode学习计划之动态规划入门day7(1014,121,122)
Leetcode学习计划之动态规划入门day8(309,714)
Leetcode学习计划之动态规划入门day9(139,42)
Leetcode学习计划之动态规划入门day10(413,91)
Leetcode学习计划之动态规划入门day11(264,96)
Leetcode学习计划之动态规划入门day12(118,119)
Leetcode学习计划之动态规划入门day13(931,120)
Leetcode学习计划之动态规划入门day14(1314,120)
Leetcode学习计划之动态规划入门day15(62,63)
Leetcode学习计划之动态规划入门day16(64,221)
Leetcode学习计划之动态规划入门day17(5,516)
Leetcode学习计划之动态规划入门day18(300,376)
Leetcode学习计划之动态规划入门day19(392,1143,72)
Leetcode学习计划之动态规划入门day20(322,518)
Leetcode学习计划之动态规划入门day21(377,343,279)
1.3 概率题面试突击系列
Leetcode 面试题 01.05. 一次编辑(medium)
Leetcode 面试题 04.06. 后继者(medium)
Leetcode 面试题 17.11. 单词距离(medium)
剑指 Offer II 114. 外星文字典(difficult)
Leetcode顺序目录:
Leetcode0001: 两数之和(simple, 4种解法)
Leetcode0003: 无重复字符的最长子串(medium)
Leetcode0005. 最长回文子串(medium, 枚举遍历,动态规划)
Leetcode0006: Z字形变换(medium, 置换处理)
Leetcode0008. 字符串转换整数 (atoi)(medium, 有限状态机)
Leetcode0027: 移除元素(simple, 双指针法)
Leetcode0028: 实现 strStr()(simple, sliding window)
Leetcode0064. 最小路径和(medium,动态规划)
Leetcode0070:参见上面动态规划入门
Leetcode0125. 验证回文串(simple,两种解法)
Leetcode0127. 单词接龙(difficult,双向BFS)
Leetcode0136: 只出现一次的数字(simple)
Leetcode0137:只出现一次的数字 II (medium)
Leetcode0145: 二叉树的后序遍历(simple,递归,迭代)
Leetcode0172. 阶乘后的零(medium,四种解法)
Leetcode0200. 岛屿数量(medium, 广度优先)
Leetcode0213: 打家劫舍 II(medium, 动态规划)
Leetcode0239. 滑动窗口最大值(difficult, 滑动窗,优先队列)
Leetcode0258: 各位相加(simple, recursion)
Leetcode0279: 完全平方数(medium, BFS)
Leetcode0307. 区域和检索 - 数组可修改(medium, 线段树)
Leetcode0310. 最小高度树(medium,拓扑排序)
Leetcode0322: 零钱兑换(medium, BFS)
Leetcode0357. 统计各位数字都不同的数字个数(medium)
Leetcode0365. 水壶问题(medium,数学方法,DFS)
Leetcode0380. O(1) 时间插入、删除和获取随机元素(medium)
Leetcode0386. 字典序排数(medium,字典树)
Leetcode0388. 文件的最长绝对路径(medium, 栈, DFS)
Leetcode0393: UTF-8 编码验证(medium, 动态规划)
Leetcode0398. 随机数索引(medium,哈希表,蓄水池抽样)
Leetcode0417. 太平洋大西洋水流问题(medium)
Leetcode0420. 强密码检验器(difficult)
Leetcode0427. 建立四叉树(medium,递归)
Leetcode0429. N 叉树的层序遍历(medium, BFS)
Leetcode0432. 全 O(1) 的数据结构(difficult)
Leetcode0433. 最小基因变化(medium,BFS)
Leetcode0440. 字典序的第K小数字(difficult, 字典树)
Leetcode0442. 数组中重复的数据(medium)
Leetcode0449. 序列化和反序列化二叉搜索树(medium)
Leetcode0450. 删除二叉搜索树中的节点(medium)
Leetcode0462. 最少移动次数使数组元素相等 II(medium)
Leetcode0467. 环绕字符串中唯一的子字符串(medium)
Leetcode0479. 最大回文数乘积(difficult)
Leetcode0509:参见上面动态规划入门
Leetcode0521: 最长特殊序列 Ⅰ(simple, 字符串处理)
Leetcode0540: 有序数组中的单一元素(medium)
Leetcode0542. 01 矩阵(medium,BFS)
Leetcode0547. 省份数量(medium,DFS,BFS,并查集)
Leetcode0553: 最优除法(medium,动态规划)
Leetcode0564: 寻找最近的回文数(difficult^2)
Leetcode0587. 安装栅栏(difficult,凸包)
Leetcode0589: N 叉树的前序遍历(simple, 递归)
Leetcode0590: N 叉树的后序遍历(simple, 递归,迭代)
Leetcode0591. 标签验证器(difficult)
Leetcode0599: 两个列表的最小索引总和(simple)
Leetcode0606. 根据二叉树创建字符串(simple)
Leetcode0653. 两数之和 IV - 输入 BST(simple, 树的遍历,哈希方法)
Leetcode0661. 图片平滑器(simple,滑动窗)
Leetcode0668. 乘法表中第k小的数(difficult)
Leetcode0682. 棒球比赛(simple, 双指针法)
Leetcode0688: 骑士在棋盘上的概率(medium)
Leetcode0688: 骑士在棋盘上的概率(medium, 基于概率转移矩阵的解法)
Leetcode0690: 员工的重要性(medium,树的遍历)
Leetcode0695. 岛屿的最大面积(medium, BFS, DFS)
Leetcode0699. 掉落的方块(difficult)
Leetcode0713. 乘积小于 K 的子数组(medium)
Leetcode0717: 1比特与2比特字符(simple, 动态规划)
Leetcode0720. 词典中最长的单词(simple)
Leetcode0733. 图像渲染(simple,BFS)
Leetcode0744. 寻找比目标字母大的最小字母(simple, 二分法)
Leetcode0746:参见上面动态规划入门
Leetcode0752. 打开转盘锁(medium,BFS)
Leetcode0762. 二进制表示中质数个计算置位(simple)
Leetcode0780. 到达终点(difficult,辗转相除法)
Leetcode0785. 判断二分图(medium,二分图,DFS)
Leetcode0797. 所有可能的路径(medium, DFS)
Leetcode0798: 得分最高的最小轮调(difficult)
Leetcode0802. 找到最终的安全状态(medium,DFS,拓扑排序)
Leetcode0804. 唯一摩尔斯密码词(simple)
Leetcode0806. 写字符串需要的行数(simple)
Leetcode0824. 山羊拉丁文(simple,字符串处理)
Leetcode0829. 连续整数求和(difficult)
Leetcode0841. 钥匙和房间(medium,DFS,BFS)
Leetcode0847. 访问所有节点的最短路径(difficult,BFS,状态压缩)
Leetcode0863: 二叉树中所有距离为 K 的结点(medium, BFS, DFS)
Leetcode0865. 具有所有最深节点的最小子树(medium)
Leetcode0886. 可能的二分法(medium,二分图)
Leetcode0905. 按奇偶排序数组(simple,双指针法)
Leetcode0934. 最短的桥(medium,BFS)
Leetcode0961. 在长度 2N 的数组中找出重复 N 次的元素(simple)
Leetcode0969: 煎饼排序(medium, BFS)
Leetcode0969: 煎饼排序(medium, DFS)
Leetcode0969: 煎饼排序(medium, 动态规划)
Leetcode1021. 删除最外层的括号(simple)
Leetcode1022. 从根到叶的二进制数之和(simple)
Leetcode1091. 二进制矩阵中的最短路径(medium,BFS)
Leetcode1137:参见上面动态规划入门
Leetcode1144. 递减元素使数组呈锯齿状(medium)
Leetcode1162. 地图分析(medium,BFS)
Leetcode1189: “气球”最大数量(simple)
Leetcode1129. 颜色交替的最短路径(medium,BFS)
Leetcode1254. 统计封闭岛屿的数目(medium)
Leetcode1305. 两棵二叉搜索树中的所有元素(medium)
Leetcode1306. 跳跃游戏 III(medium,BFS,DFS)
Leetcode1319. 连通网络的操作次数(medium,BFS,DFS)
Leetcode1376. 通知所有员工所需的时间(medium,DFS,DP)
Leetcode1466. 重新规划路线(medium,BFS)
Leetcode1557. 可以到达所有点的最少点数目(medium)
Leetcode1601: 最多可达成的换楼请求数目(difficult)
Leetcode1606. 找到处理最多请求的服务器(difficult,优先队列,有序数组)
Leetcode1615. 最大网络秩(medium,图论基础)
Leetcode1640. 能否连接形成数组(simple)
Leetcode1654. 到家的最少跳跃次数(medium,BFS)
Leetcode1672. 最富有客户的资产总量(simple)
Leetcode1728. 猫和老鼠 II(difficult)
Leetcode1791: 找出星型图的中心节点(simple)
Leetcode1926. 迷宫中离入口最近的出口(medium,BFS)
Leetcode1994: 好子集的数目(difficult)
Leetcode2016: 增量元素之间的最大差值(simple, dp)
Leetcode2022. 将一维数组转变成二维数组(simple)
Leetcode2024. 考试的最大困扰度(medium)(滑动窗,双指针)
Leetcode2028. 找出缺失的观测数据(medium,数学)
Leetcode2038. 如果相邻两个颜色均相同则删除当前颜色(medium, dp, greedy)
Leetcode2039. 网络空闲的时刻(medium, BFS)
Leetcode2044. 统计按位或能得到最大值的子集数目(medium)
Leetcode2049: 统计最高分的节点数目(medium, DFS)
Leetcode2086. 从房屋收集雨水需要的最少水桶数(medium)
Leetcode2100: 适合打劫银行的日子(medium, 滑动窗,动态规划)
Leetcode2104: 子数组范围和(medium, iteration)
Leetcode2207. 字符串中最多数目的子字符串(medium)
2022-02-21:立下一个flag。努力保持每日一题打卡。不过我知道这个很难(毕竟还要努力工作糊口^-^),比如说碰上一道困难级别的问题大抵就要放鸽子了(前几天的Leetcode1719就还一直没有补上)^-^. 先定一个小目标:努力争取2022年年度打卡率80%。
当然,随时记录一些解题总结心得,也是必须有的题中之义。
2022-02-21:Leetcode969。终于给出一个能通过leetcode的基于动态规划解法。DFS、BFS和动态规划都是解决算法问题的通用框架。但是各有各的特长各有各自的最擅长的战场。如何在第一时间找到最适合的解法呢?估计这个只能凭借“无它,唯手熟尔”?
2022-02-23: Leetcode322: 一个巨大的教训是,visited用set()与用list有巨大的速度之差。一开始用list实现visited。。。超出时间限制。后来参考评论区的改用set,同一个超时的case在本机上执行的用时为1.77s vs 0.016s,竟然有100倍之巨!!!
Lists are slightly faster than sets when you just want to iterate over the values.
Sets, however, are significantly faster than lists if you want to check if an item is contained within it. They can only contain unique items though. It turns out tuples perform in almost exactly the same way as lists, except for their immutability.
2022-02-27: Leetcode553. 被去除冗余括号的处理要了老命了。。。感觉这个字符串处理比算法本身还要难(或者说只是麻烦吧),或许只是我没有找对路^-^。同样都是medium,Leetcode137跟Leetcode553的难度感觉也差了一个量级。。。不过做完Leetcode136后,发现Leetcode137当前解法不能满足线性时间复杂度的要求,要重新考虑。
2022-03-01: 有时候看看Leetcode官方题解和别人的别出心裁的题解,每每惊叹于其中代码的紧凑简洁。不过,这个不能完全模仿。过于简洁会伤害代码的可读性,在一边提高代码技巧的同时还是要坚持写自己能看懂的代码。坚持自己的叙述方式最重要。
Leetcode0007之前好像发布过,不过今天不知道什么误操作貌似把这篇给删除了^-^(CSDN的编辑器还是不够好用,经常被坑)。只好重做一次,不过可以确信的是,这次的解法跟之前的是不一样的。
2022-03-31:完成一个月的刷题打卡,纪念一下。
2022-04-14 今天这篇博客遭遇了审查未通过的命运,原因是”违法违规“。每天把当天解的leetcod每日一题的博客的链接加到这篇文中而已,只是为了方便感兴趣的小伙伴能够按顺序查找而已。之前已经提交过100次,今天又加了一篇,然后就违法违规了。。。CSDN的审查算法难道是量子(不确定性)算法吗?被封禁在家快满一个月,不知何时休?国家有难必有妖孽出没,这CDSN的审查算法也是妖孽操纵了吗?
几天前开始除了leetocode每日一题外,启动了”图论基础”专题训练,为期14天,总共28道题。今天是第5天还是第6天,感觉这样集中地针对某一个主题的特训也很有效果,现在那着一道普通的图搜索问题,几乎可以直接咔嚓咔嚓几下就把代码写了,套路感满满。。。
好,追加完以上日志,重新提交,看看这次能不能过。
刚刚把上面几段可能涉及当前情况下的敏感词汇截成图片后贴上去结果就审查通过了。感到非常悲哀。难道又要回到中世纪了吗?
2022-04-17
满月了。真是一个魔幻的世界。不知道如何找到台阶下。真心希望这一切代价不是为愚蠢刚愎而付,希望这一切牺牲有配得上的理由。
2022-04-21 完成了“图论基础”学习计划,下一个专题整点啥呢?
2022-04-22 开始“动态规划入门”学习计划。从图论基础学习计划来看,这种针对一个专题集中攻克还是比较有效的学习方法
2022-04-27
今天的每日一题是leetcode417.
本题在之前图论基础学习计划中做过,但是每日一题要求也必须重新提交了一下。于是没有做任何代码重新提交了一下,结果如下:
执行用时:84 ms, 在所有 Python3 提交中击败了81.17%的用户
内存消耗:16.1 MB, 在所有 Python3 提交中击败了93.83%的用户
上次提交的性能数据是:
执行用时:72 ms, 在所有 Python3 提交中击败了94.03%的用户
内存消耗:16.3 MB, 在所有 Python3 提交中击败了71.30%的用户
这个排名数据的变化情况令我很惊讶。两项相对数据发生变化可以理解,执行用时嘛,跟服务器的当前负荷有关发生变化也可以理解?关键是“内存消耗”这一个数据,这个数据是一个绝对的量,代码没有变化,按道理来说应该是没有变化的。很好奇力扣的结果评估机制是什么。
2022-04-30
封闭隔离进入第8周。。。你问我何时能解禁?不是在此时,不知在何时,我想大约会是在冬季。。。
2022-05-12:今天完成了“动态规划入门”学习计划(21天共近50多道题目)。虽然只是入门级,但是已经有好些问题都是考虑直接学习官解或其他人的解法才蒙混过关。后面还有“基础”、“进阶”、“大师”等级别,前路漫漫,学无止境。。。先休整总结一下,再考虑下一级别攻关。
2022-05-30: