Leetcode 刷题目录
本文为按照labuladong算法小结 自行学习的总结。意为记录自己学习练习的顺序,用于日后回顾浏览。目录中附上各章labuladong的原文链接,并会附上自我练习的代码及理解。
1、数据结构
1.1、链表
1.1.1、单链表的六大解题套路
1、合并两个有序链表:Leetcode 21.合并两个有序链表merge-two-sorted-lists合并链表
2、合并K个有序链表:Leetcode 23. 合并K个升序链表merge-k-sorted-lists(合并k路有序链表 最小堆)
3、寻找单链表的倒数第K个节点: Leetcode 19.删除链表的倒数第 N 个结点 remove-nth-node-from-end-of-list(链表,快慢指针变种应用)
4、寻找单链表的中点:Leetcode 876. 链表的中间结点
5、判断单链表是否包含环并找出环起点:Leetcode 41. 环形链表(简单)linked-list-cycle——链表、判断是否循环链表、快慢指针、 Leetcode 142. 环形链表 II(中等)linked-list-cycle-ii——链表,找出开始循环节点
6、判断两个单链表是否相交并找出交点:Leetcode 160.相交链表
1.1.2、递归反转链表的一部分
1、反转链表,递归反转链表,反转链表前n,反转链表的一部分:Leetcode [92][206]. 反转链表ii&i-输入一个链表,反转链表后,输出链表的所有元素
1.1.3、如何 K 个一组反转链表
1.1.4、如何判断回文链表
1、原始思路
2、进阶思路:Leetcode [234] 回文链表 回文 链表
1.1.5、个人补充
1.2、二叉树
1.2.1、纲领篇
介绍二叉树前中后序遍历的基本框架和解题思路:Leetcode 104. 二叉树的最大深度、 Leetcode 543. 二叉树的直径 diameter-of-binary-tree
1.2.2、二叉树一
1.2.3、二叉树二
- Leetcode [654] 最大二叉树 &[105] 从前序与中序遍历序列构造二叉树 & [106] 从中序与后序遍历序列构造二叉树
- Leetcode 889. 根据前序和后序遍历构造二叉树 construct-binary-tree-from-preorder-and-postorder-traversal
1.2.4、二叉树三
1.2.5、二叉搜索树一
- 内容:利用二叉搜索树中序遍历有序的特性,正向或者逆向遍历,来进行元素的查找
- 230. BST第K小的元素(中等): Leetcode 230. 二叉搜索树中第K小的元素 kth-smallest-element-in-a-bst&& 538. 把二叉搜索树转换为累加树 convert-bst-to-greater-tree && 1038. binary-search-tree-to-greater-sum-tree
- 538. 二叉搜索树转化累加树(中等):
- 1038. BST转累加树(中等):
1.2.6、二叉搜索树二
- 内容:判断 BST 的合法性、增、删、查
- 题目:450. 删除二叉搜索树中的节点(中等)、701. 二叉搜索树中的插入操作(中等)、700. 二叉搜索树中的搜索(简单)、98. 验证二叉搜索树(中等)
- 解答: Leetcode 450. 删除二叉搜索树中的节点(中等)、701. 二叉搜索树中的插入操作(中等)、700. 二叉搜索树中的搜索(简单)、98. 验证二叉搜索树(中等)
1.2.7、二叉搜索树三
- 内容:构建二叉搜索树,使用递归的方法遍历所有可能的组合。
- 题目:96. 不同的二叉搜索树(简单);95. 不同的二叉搜索树II(中等)
- 解法:Leetcode 96. 不同的二叉搜索树(简单) 95. 不同的二叉搜索树II(中等)
1.2.8、美团面试题:二叉树的后续遍历巧妙应用
- 内容:利用后序遍历可以在处理时获取到所有信息的特性,来避免重复递归。在后序遍历时同时进行bst判断、记录最大最小值、记录累加值
- 题目:1373. 二叉搜索子树的最大键值和(困难)
- 解法:Leetcode 1373. 二叉搜索子树的最大键值和(困难)
1.2.9、二叉树的序列化
- 内容:介绍二叉树序列化与反序列化的代码框架,最简单易懂的是前序,后序较为难懂
- 题目:297. 二叉树的序列化和反序列化(困难)
- 题解: Leetcode 297. 二叉树的序列化和反序列化(困难)
1.2.10、二叉树叶子结点遍历
- 内容:通过介绍一个int&list混合结构遍历的方法,引出叶子结点的遍历。但是没有太多参考价值
- 题目:341. 扁平化嵌套列表迭代器(中等)
- 题解: Leetcode 341. 扁平化嵌套列表迭代器(中等)
1.2.11、二叉树最近公共祖先LCA
- 内容:git rebase使用LCA原理实现。LCA可以使用后序遍历框架来写
- 题目:236. 二叉树的最近公共祖先(中等)
- 题解:236. 二叉树的最近公共祖先
1.2.12、完全二叉树的节点
- 内容:结合普通二叉树以及满二叉树的方法,完成计算完全二叉树节点,logn*logn
- 题目:222. 完全二叉树的节点个数(中等)
- 题解:Leetcode 222. 完全二叉树的节点个数(中等)
1.2.13、二叉树的迭代框架
- 内容:提炼出的二叉树迭代方式的遍历框架,可用于前中后序遍历
- 题解:Leetcode 144. 二叉树的前序遍历 && 94.二叉树的中序遍历 && 145. 二叉树的后续遍历
1.3、图算法
1.3.1、图论基础
- 内容:图一般使用邻接表或者邻接矩阵表示,图的遍历可以参考多叉树的遍历。对于有环图,则可以添加visited来辅助
- 题目:797. 所有可能的路径(中等)
- 题解:Leetcode 797. 所有可能的路径(中等)
1.3.2、拓扑排序
- 内容:介绍如何判断图是否有环,如何对图进行拓扑排序,即根据依赖关系顺序排序
- 题目:207. 课程表、210. 课程表 II
- 题解:Leetcode 207. 课程表 && 210. 课程表 II
1.3.3、二分图判定
- 内容:介绍判定二分图。二分图就是图的节点可以染成两种颜色且相邻节点颜色不同。在遍历时根据是否访问过判定子节点与根节点颜色是否相同。
- 题目:785. 判断二分图(中等) 886. 可能的二分法(中等)
- 题解:Leetcode 785. 判断二分图(中等)& 886. 可能的二分法(中等) 二分图判断
1.3.4、并查集原理、并查集应用
- 内容:并查集的基本原理,以及用并查集来解决连通性相关的题目
- 题目:130. 被围绕的区域(中等) 990. 等式方程的可满足性(中等)
- 题解:Leetcode 130. 被围绕的区域(中等)DFS||并查集 Leetcode 990. 等式方程的可满足性(中等) 并查集
1.3.5、Kruskal最小生成树
- 内容:基于并查集实现最小生成树。针对无向有权重图,计算整张图联通的最小权重和的问题
- 题目:261. 以图判树(中等)、1135. 最低成本联通所有城市(中等)、1584. 连接所有点的最小费用(中等)
- 题解:Leetcode 261. 以图判树(中等) 1135. 最低成本联通所有城市(中等) 1584. 连接所有点的最小费用(中等) 并查集&Kruskal最小生成树
1.3.6、名流问题
- 内容:判断图中入度为n-1,出度为0的结点。使用遍历加两两排除的方法。得到最后的候选结点后再进行完全判断
- 题目:277. 搜索名人(中等)
- 题解:Leetcode 277.搜索名人(中等) 图相关-名流问题
1.3.7、Dijkstra算法
- 内容:针对求结点间的最小路径权重和的问题。类似使用DP Table记录的BFS遍历。条件是:加权有向图,没有负权重边
- 题目:743. 网络延迟时间(中等)、1514. 概率最大的路径(中等)、1631. 最小体力消耗路径(中等)
- 题解:Leetcode 743. 网络延迟时间(中等) 1514. 概率最大的路径(中等) 1631. 最小体力消耗路径(中等)Dijkstra求两点间的最小权重和
1.4、数据结构
1.4.1、LRU
- 内容:缓存淘汰,淘汰最久未被使用的元素
- 题目:146. LRU缓存机制(中等)
- 题解:Leetcode 146. LRU 缓存机制
1.4.2、LFU
- 内容:记录key的使用频次,移除频次最低的key,如果频次相同,则移除相同频次中最旧的
- 题目:460. LFU 缓存机制(困难)
- 题解:Leetcode 460. LFU 缓存机制(困难)
1.4.3、前缀树/字典树
- hold on
1.4.4、最大频率栈
1.4.5、数据流中求中位数
- 内容:持续不断输入数据,中途随时会求中位数。用大根堆存小数,用小根堆存大数,保持两队大小想等
- 题目:295. 数据流的中位数(困难
- 题解:Leetcode 295. 数据流的中位数(困难)
1.4.6、设计 Twitter:合并 k 个有序链表和面向对象设计
- 内容:使用大根堆实现多路归并排序,实现了按照发送时间由近到远打印推文
- 题目:355. 设计推特(中等)
- 题解: Leetcode 355. 设计推特(中等) 多路归并&面向对象设计
1.4.7、单调栈
- 内容:单调栈求解序列中比后边大的第一个数(Next Great Number)之类的问题
- 题目:496. 下一个更大元素I(简单)、503. 下一个更大元素II(中等)、739. 每日温度(中等)
- 题解:Leetcode 496. 下一个更大元素I(简单) 503. 下一个更大元素II(中等) 739. 每日温度(中等) 单调栈
1.4.8、单调队列
- 内容:单调队列,用list实现单调队列,求窗口最大值问题
- 题目:239. 滑动窗口最大值(困难)
- 题解:Leetcode 239. 滑动窗口最大值(困难) 单调队列解决滑动窗口最大值
1.4.9、堆排序与优先级队列实现
1.4.10、用栈实现队列以及用队列实现栈
- 内容:栈实现队列:用双栈,当需要pop时,从s1将数据逐个压入s2,那么s2栈顶元素就是需要出队列的元素
- 队列实现栈:单个队列,用一个额外变量记录栈顶值。当出栈时,从队列中取出size-1个元素重新放入队列,那么倒数第二个元素就是栈顶,记录一下,倒数第一个元素就是需要出栈元素
1.5、数组题目
1.5.1、前缀和数组
- 内容:记录原点到当前位置的元素和,用于求解窗口的和问题
- 题目:303. 区域和检索 - 数组不可变(中等)、304. 二维区域和检索 - 矩阵不可变(中等)、560. 和为K的子数组(中等)
- 题解:Leetcode 303. 区域和检索 - 数组不可变(中等) 304. 二维区域和检索 - 矩阵不可变(中等) 560. 和为K的子数组(中等) 前缀和数组求窗口和
1.5.2、差分数组
- 内容:差分数组求区间内频繁加减问题。差分数组中记录的是diff[n]=num[n]-num[n-1],对于区间的加减只反应到diff[start]+=inc,diff[end+1]-=inc
- 题目:370. 区间加法(中等)、1109. 航班预订统计(中等)、1094. 拼车(中等)
- 题解:Leetocde 370. 区间加法(中等) 1109. 航班预订统计(中等) 1094. 拼车(中等) 差分数组求频繁区间增减问题
1.5.3、循环遍历二维数组
- 内容:旋转二维数组,以及循环遍历二维数组的方法
- 题目:48. 旋转图像(中等)、54. 螺旋矩阵(中等)、59. 螺旋矩阵 II(中等)
- 题解:Leetcode 48. 旋转图像(中等) 54. 螺旋矩阵(中等) 59. 螺旋矩阵 II(中等) 旋转遍历二维数组
1.5.4、双指针技巧
- 内容:快慢指针求链表有环以及环起点;双指针夹逼求两数之和;快慢指针删除链表第n个结点
- 题目:141. 环形链表(简单)、142. 环形链表II(简单)、167. 两数之和 II - 输入有序数组(中等)、344. 反转字符串(简单)、19. 删除链表倒数第 N 个元素(中等)、876. 链表的中间结点
- 题解:Leetcode 141. 环形链表(简单) 142. 环形链表II(简单) 快慢指针判断环形链表
- Leetcode 167. 两数之和 II - 输入有序数组(中等) 344. 反转字符串(简单) 两端指针夹逼
- Leetcode 19.删除链表的倒数第 N 个结点 remove-nth-node-from-end-of-list(链表,快慢指针变种应用)
1.5.5、滑动窗口算法
- 内容:滑动窗口,用于求解是否包含子串、子序列的问题
- 题目:76. 最小覆盖子串(困难)、567. 字符串的排列(中等)、438. 找到字符串中所有字母异位词(中等)、3. 无重复字符的最长子串(中等)
- 题解:Leetcode 76. 最小覆盖子串(困难) 567. 字符串的排列(中等) 438. 找到字符串中所有字母异位词(中等) 3. 无重复字符的最长子串(中等) 滑动窗口算法
1.5.6、二分查找
- 内容:二分查找经典实现以及查找左右边界的变种
- 题目:704. 二分查找(简单)、34. 在排序数组中查找元素的第一个和最后一个位置(中等)
- 题解:Leetcode 704. 二分查找(简单) 34. 在排序数组中查找元素的第一个和最后一个位置(中等) 二分查找以及边界查找
1.5.7、二分查找高级应用
- 内容:二分查找左右边界,套用单调特征函数f,来求解多重条件下的极值问题。套路为先总结出单调递增或递减的特征函数,然后将f(mid)套用进二分查找求边界的框架中
- 题目:875. 爱吃香蕉的珂珂(中等)、1011. 在D天内送达包裹的能力(中等)
- 题解:Leetcode 875. 爱吃香蕉的珂珂(中等) 1011. 在D天内送达包裹的能力(中等) 二分查找高级用法
1.5.8、二分查找高级应用二
- 内容:一道比较绕的二分查找应用题。需要反向思考f函数的意义,再套框架
- 题目:410. 分割数组的最大值(困难)
- 题解:Leetcode 410. 分割数组的最大值(困难) 二分查找高阶应用
1.5.9、田忌赛马策略应用
- 内容:使用田忌赛马策略,用nums1的最大值比较nums2的大值,大于则设置,小于则设最小值来放弃比较
- 题目:870. 优势洗牌(中等)
- 题解:Leetcode 870. 优势洗牌(中等) 田忌赛马策略
1.5.10、常数时间进行删除、查找元素
- 内容:使用数组与Map结合,实现常数时间查找、删除元素,或者返回随机数
- 题目:380. 常数时间插入、删除和获取随机元素(中等)、710. 黑名单中的随机数(困难)
- 题解:Leetcode 380. 常数时间插入、删除和获取随机元素(中等) 710. 黑名单中的随机数(困难) 使用数组实现随机查找以及等概率随机返回
1.5.11、带权重的随机选择算法
- 内容:使用前缀和数组模拟膨胀后的线段,使用二分查找左侧边界查找对应点
- 题目:528. 按权重随机选择(中等)
- 题解:Leetcode 528. 按权重随机选择(中等) 前缀和数组+二分查找左侧边界
1.5.12、数组去重
- 内容:利用单调栈+count计数实现去重以及最小字节序排布
- 题目:316. 去除重复字母(中等)、1081. 不同字符的最小子序列(中等)
- 题解:Leetcode 316. 去除重复字母(中等) 1081. 不同字符的最小子序列(中等) 字符串去重
1.5.13、原地去除有序数组的重复元素
- 内容:使用快慢指针思想,快指针遍历元素,慢指针保存满足条件的元素
- 题目:26. 删除有序数组中的重复项(简单)、83. 删除排序链表中的重复元素(简单)、27. 移除元素(简单)、283. 移动零(简单)
- 题解:Leetcode 26. 删除有序数组中的重复项(简单) 83. 删除排序链表中的重复元素(简单) 27. 移除元素(简单) 283. 移动零(简单)数组操作原地移除
1.5.14、twoSUM问题
- hold on
2、动态规划
2.1、动态规划基本技巧
2.1.1、动态规划解题核心框架
- 内容:基础框架,从base case以及推导式
- 题目:509. 斐波那契数(简单)、322. 零钱兑换(中等)
- 题解:Leetcode 322. 518 零钱兑换 I II 动态规划
2.1.2、动态规划设计-数学归纳思想
- 内容:通过数学归纳提炼出状态转移方程
- 题目:300. 最长递增子序列(中等)
- 题解:Leetcode 300.最长递增子序列 动态规划
2.1.3、最优子结构原理和dp数组遍历方向
- 内容:在理论上讲解了数组遍历方向,都是理论
2.1.4、base case和备忘录的初始值如何设置
- 内容:如何找出base case与备忘录初始值
- 题目:931. 下降路径最小和(中等)
- 题解:Leetcode 931. 下降路径最小和(中等) 动态规划
2.1.5、状态压缩方法
- 内容:介绍使用状态压缩方法降低空间复杂度,以最长回文子序列举例。可以最后再看
2.1.6、动态规划与回溯算法联系
- 内容:通过对一道问题分别使用回溯和动态规划推导来讲解,理论更多,可以以后再看
- 题目:494. 目标和(中等)
- 题解:Leetcode 494. 目标和(中等)回溯算法
2.2、子序列问题
2.2.1、编辑距离
- 内容:通过增、删、改 使word1等于word2,怎样操作最小
- 题目:72. 编辑距离(困难)
- 题解:Leetcode 72 编辑距离edit-distance-动态规划,计算两词之间变换的最小步数
2.2.2、最长递增子序列
- 内容:找出最长的递增子序列,注意子序列可以不连续。简单方法使用动态规划,On^2;更复杂方法使用堆+二分查找左侧边界,nlogn
- 题目:300. 最长递增子序列(中等)
- 题解:Leetcode 300.最长递增子序列 动态规划
2.2.3、二维递增子序列:信封嵌套问题
- 内容:大信封可以嵌套小信封,求最大嵌套数。先对w升序排序,当w相等,则h降序,保障相同w的信封只取h最大的。然后对h求增长递增子序列。
- 题目:354. 俄罗斯套娃信封问题(困难)
- 题解:Leetcode 354. 俄罗斯套娃信封问题
2.2.4、最大子数组
- 内容:求最大连续子数组和。定义dp[i]为以i为结尾的子数组。dp[i]=max(nums[i],dp[i-1]+nums[i])
- 题目:53. 最大子序和(简单)
- 题解:Leetcode 53. 最大子序和(简单)动态规划
2.2.5、最长公共子序列
- 内容:dp[i][j]定义为以i,j结尾的最长公共子序列,当s1[i-1]==s2[j-1]时,dp[i][j]=1+dp[i-1][j-1].
- 题目:1143. 最长公共子序列(中等)、583. 两个字符串的删除操作(中等)、712. 两个字符串的最小ASCII删除和(中等)
- 题解:Leetcode 1143. 最长公共子序列(LCS)动态规划、Leetcode 583. 两个字符串的删除操作 动态规划、Leetcode 712. 两个字符串的最小ASCII删除和 动态规划 LCS
2.2.6、子序列问题模板
- 内容:总结子序列问题模板,一种一维数组遍历,一种二维数组遍历
- 题目:516. 最长回文子序列(中等)
- 题解:Leetcode 516. 最长回文子序列 动态规划、Leetcode 5.最长回文子串 动态规划
2.3、背包问题
2.3.1、0-1背包
- 内容:背包问题通用模板,dp[i][j]表示对于前i种物品,j的容量可以获得的最大价值
2.3.2、子集背包问题
- 内容:求能否对半分为两部分。可以转化成背包装进sum/2。dp[i][j]表示对于i种物品,能否正好累加成j
- 题目:416. 分割等和子集(中等)
- 题解:Leetcode 416. 分割等和子集 背包问题变种 动态规划
2.3.3、完全背包问题
- 内容:零钱兑换II,求有多少种兑换方法。dp[i][j]表示i中硬币兑换j面额有多少种方法
- 题目:518. 零钱兑换II(中等)
- 题解:Leetcode 322. 518 零钱兑换 I II 动态规划
2.4、动态规划玩游戏-走各种地图路径
2.4.1、动态规划之最小路径和
- 内容:走二维地图最小路径和,二维遍历
- 题目:64. 最小路径和(中等)
- 题解:Leetcode 64. 最小路径和(中等) 动态规划
2.4.2、地下城游戏
- 内容:可以不用看讲解,直接看题解中的理解。直接使用dp数组进行规划,base case为到终点还有1滴血。从终点往原点遍历
- 题目:174. 地下城游戏(困难)
- 题解:Leetcode 174. 地下城游戏(困难) 动态规划
2.4.3、动态规划帮我通关了《辐射4》(跳过)
2.4.4、加权最小路径
- 内容:既可以使用dijkstra算法求点到点之前的最短路径(非负无环),也可以使用动态规划
- 题目:787. K 站中转内最便宜的航班(中等)
- 题解:Leetcode 787. K 站中转内最便宜的航班(中等) 动态规划
2.4.5、经典动态规划:正则表达式
- 内容:s与p是否可以匹配,.全匹配,*数量不定。可以不用看讲解,直接看题解,有递归和dp数组两种方法。主要区别的情况是p[j]=='*'的时候
- 题目:10. 正则表达式匹配(困难)
- 题解:Leetcode 10.正则表达式匹配 动态规划
2.4.6、经典动态规划:高楼扔鸡蛋 高楼扔鸡蛋进阶
- 内容:难度比较大,可以只看下I了解下思路,先不用看进阶
- 题目:887. 鸡蛋掉落(困难)
- 题解:Leetcode 887. 鸡蛋掉落 动态规划
2.4.7、经典动态规划:戳气球
- 内容:难度较大。注意定义为最后戳破的气球为k时,在[i,j]区间的最大值为dp[i][j]=dp[i][k]+dp[k][j]+points[i]*points[k]*points[j]([i,k]区间最大值+[j,k]区间最大值+最后戳破的气球k的值)
- 题目:312. 戳气球(困难)
- 题解:Leetcode 312. [312] 戳气球 动态规划
2.4.8、经典动态规划:博弈问题
- 内容:两人先后手取石子堆,看最后先手与后手的差距。dp[i][j].first意味着i-j堆石子先手最大可以拿到的数量,second指后手的。
- 题目:877. 石子游戏(中等)
- 题解:Leetcode [877] 石子游戏I 动态规划
2.4.9、经典动态规划:四键键盘
- 内容:先使用dp函数逐个递归求导,而后转换思路使用dp数组,dp[i]表示走i步打印出的数目。j=2;j<i;遍历求取从j开始粘贴后得到的结果
- 题目:651. 四键键盘(中等)
- 题解:Leetcode [650] 只有两个键的键盘 & Leetcode [651] 四键键盘 动态规划
2.4.10、一个方法团灭 LEETCODE 打家劫舍问题
- 内容:不能取相邻两数,->有环->二叉树上遍历。
- 题目:198. 打家劫舍(简单)、213. 打家劫舍II(中等)、337. 打家劫舍III(中等)
- 题解:Leetcode [198] [213][337]打家劫舍 i&ii&iii 动态规划
2.4.11、一个方法团灭 LEETCODE 股票买卖问题
- 内容:dp[i][k][0] i天,最大交易次数为k,0表示未持有,1表示持有股票
- 题目:121. 买卖股票的最佳时机(简单)、122. 买卖股票的最佳时机 II(简单)、123. 买卖股票的最佳时机 III(困难)、188. 买卖股票的最佳时机 IV(困难)、309. 最佳买卖股票时机含冷冻期(中等)、714. 买卖股票的最佳时机含手续费(中等)
- 题解:Leetcode [121][122][123][188][309][714] 买卖股票的最佳时机i ii iii iv 含冷冻期 含手续费 动态规划
2.4.12、有限状态机之 KMP 字符匹配算法
- 内容:跳过
2.4.13、构造回文的最小插入次数
- 内容:dp[i][j]代表字符串s[i][j]构造成回文的最小插入次数,那么当s[i]==s[j]时,dp[i][j]=dp[i+1][j-1];不等时,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1,也就是i+1,j或者i,j-1最小值,然后在该构造完成的回文串上加上一次操作构成ij回文串
- 题目:1312. 让字符串成为回文串的最少插入次数(困难)
- 题解:Leetcode [1312] 让字符串成为回文串的最少插入次数 动态规划、Leetcode [234] 回文链表 回文 链表
2.5、贪心类型问题
2.5.1、贪心算法之区间调度问题
- 内容:求不重叠的区间数。先按end排序,当后一个start>end或者start>=end时,不重叠加1,同时更新end
- 题目:435. 无重叠区间(中等)、452. 用最少数量的箭引爆气球(中等)
- 题解:Leetcode 435 无重叠区间 & Leetcode 452 用最少数量的箭引爆气球 贪心 动态规划
2.5.2、扫描线技巧:安排会议室
- 内容:使用扫描线技巧求最大重叠数。遇到start时count++,遇到end时count--
- 题目:252. 会议室、253. 会议室 II
- 题解:Leetcode 252. 会议室 253. 会议室II 贪心算法-扫描线技巧
2.5.3、剪视频剪出一个贪心算法
- 内容:在一些区间中,最少选取多少个区间可以拼成[0,T]。先按start排序,如果start相同按end从大到小排序。然后选择时,选择start<=上一个选取视频end的所有区间中end最大的。然后更新end,选取下一个,知道拼凑成[0,T]
- 题目:1024. 视频拼接(中等)
- 题解:Leetcode 1024. 视频拼接(中等) 贪心算法
2.5.4、如何运用贪心思想玩跳跃游戏
- 内容:数组内存放能跳跃的最大值,问能否到达。以及最少可以跳多少步。遍历时记录能到达的最远位置。如果位置<=i就意味着不能再前进
- 题目:55. 跳跃游戏(中等)、45. 跳跃游戏 II(中等)
- 题解:LeetCode 55. 跳跃游戏(Jump Game)I II tag 数组 贪心 动态规划
2.5.5、贪心算法之环形加油站能否走一周
- 内容:环形加油站走一周,将累加的最小值作为起点
- 题目:134. 加油站(中等)
- 题解:Leetcode 134. 加油站(中等) 贪心算法
3、常用算法技巧
3.1、暴力搜索算法
3.1.1、回溯算法解题套路框架
- 内容:回溯算法,处理全排列问题。在递归函数中写清楚结束条件,以及放入和退出元素
- 题目:46. 全排列(中等)、51. N 皇后(困难)
- 题解:Leetcode 46. 全排列(中等) 回溯算法、Leetcode 51. N 皇后 N-Queens I II(n皇后问题)(转)
3.1.2、经典回溯算法:集合划分问题
- 内容:递归处理能否将数组平均划分为k组的问题
- 题目:698. 划分为k个相等的子集(中等)
- 题解:Leetcode 698. 划分为k个相等的子集(中等) 回溯算法=集合划分
3.1.3、一文秒杀所有排列/组合/子集问题
- 内容:一种用start来做递归变量,一种用used做变量。有些元素不重复,有些元素可能有重复
- 题目:78. 子集(中等)、90. 子集 II(中等)、77. 组合(中等)、39. 组合总和(中等)、40. 组合总和 II(中等)、216. 组合总和 III(中等)、46. 全排列(中等)、47. 全排列 II(中等)
- 题解:LeetCode 78 子集 Subsets I& II——递归、Leetcode 77. 组合(中等)回溯算法、Leetcode 39. 组合总数(1 2) tag 数组 回溯法、Leetcode 46. 全排列(中等) 回溯算法
3.1.4、回溯算法最佳实践:解数独
- 内容:从1-9全部遍历所有格子,然后判断是否合法。类似8皇后
- 题目:37. 解数独(困难)
- 题解:Leetcode 37. 解数独(困难) 回溯算法
3.1.5、岛屿问题
- 内容:回溯算法,处理岛屿问题。包括岛屿个数、不临边的岛屿、面积、子岛屿等
- 题目:200. 岛屿数量、1020. 飞地的数量、695. 岛屿的最大面积、1905. 统计子岛屿、694. 不同岛屿的数量
- 题解: Leetcode 694. 不同岛屿的数量 中等 回溯 岛屿问题
4、经典题目
- LeetCode刷题05-42. 接雨水 tag 数组 hard 407. 接雨水 II hard
-
leetcode 8. 字符串转换整数 (atoi) : 状态机实现跳转,并考虑INT_MIN和INT_MAX的边界条件