![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
算法/Leetcode
文章平均质量分 53
主要记录一些Leetcode题解以及一些数据结构与算法内容
风不贪
正在后端坑里摸爬滚打
展开
-
Leetcode. Largest Rectangle in Histogram
1. 题解题目链接🔗:84. Largest Rectangle in Histogram这道题和42. Trapping Rain Water有些相像,但是42题求的是能围住的最大面积,而本题求的是连成的矩阵的最大面积,因而在计算面积的方法上有些许不同。85. Maximal Rectangle就是在本题基础上的变式,通过一系列变化可以使用本题方法。分析简单分析可以知道最大矩形面积有两种情况:当前矩形的高度heights[i] * 1当前矩形的高度heights[i] * (向右第一个比原创 2022-03-15 18:41:53 · 7446 阅读 · 0 评论 -
Leetcode - 回溯算法(Backtracking)解题模板
回溯算法(Backtracking)的使用场景主要是解决排列组合问题,这类问题的共性就是需要穷举所有的可能/组合,这也意味在不做优化的情况下,需要遍历所有的情况,这也决定了回溯算法无论怎样优化,复杂度都是O(N!)原创 2021-12-13 00:07:33 · 414 阅读 · 0 评论 -
72. 编辑距离
LeetCode.72 编辑距离(Hard)编辑距离属于经典的动态规划题目,看似十分困难,其实解法十分简单。而所有动态规划题目的解题思路都是找:找到base case(递归结束的条件)找到状态转移方程(递归每一步做的事情 + 返回的值)因为处理的是两个字符串,所以通常使用双指针,分别指向两个字符串的末尾。从后向前递归,当任一字符串走完时,另一字符串剩下的长度就是剩余的步数/操作数。int dp(String str1, String str2, int i, int j) { // base原创 2021-06-08 22:07:30 · 84 阅读 · 0 评论 -
BFS解题框架
BFS(Breath First Search,广度优先算法)和DFS(Depth First Search,深度优先算法)是非常常用的两种算法,其中DFS通常被认为是“回溯算法”。BFS相对DFS的最大区别是:BFS找到的路径一定是最短的,但代价是空间复杂度比DFS大很多。BFS的核心思想:把一个问题抽象成图,从一个点开始,向四周扩散。通常BFS算法都是需要“队列”这种数据结构,把一个点周围的点加入这个队列。算法框架int BFS(Node start, Node end) { Queue原创 2021-06-07 10:02:14 · 70 阅读 · 0 评论 -
98. 验证二叉搜索树
LeetCode.98 验证二叉搜索树1.中序遍历结果为升序最直观/直接的解法:对二叉搜索树进行中序遍历,将结果存入一个数组,然后判断数组是否为生序即可验证二叉搜索树private List<Integer> list;public boolean isValidBST(TreeNode root) { list = new ArrayList<>(); addNode(root); // 判断是否为升序 for (int i = 1; i &原创 2021-04-03 10:45:05 · 70 阅读 · 0 评论 -
235/236. 二叉树搜索树/二叉树的公祖先:递归
LeetCode.235 二叉搜索树的最近公共祖先(Easy)LeetCode.236 二叉树的最近公共祖先(Medium)这两题做法不同,但题目看起来非常相似,所以放在一起记录。一、LeetCode.235 二叉搜索树的最近公共祖先二叉搜索树的特性是已经根据元素的大小关系排序,因而在寻找最近公共祖先时应当把这个关系利用起来。二叉搜索树中两个节点的最近公共祖先是:p.val < root.val < q.val || p.val > root.val > q.val。cla原创 2021-03-23 10:10:18 · 68 阅读 · 0 评论 -
389.找不同:位运算
LeetCode 389.找不同美好 (Easy)自己想出了方法一,方法二和方法三借鉴了力扣的官方题解。方法一:排序后找不同因为两个字符串中只多出了一个字符,其余字符全都相同,且多出一个字符的字符串为前一个字符串的随机排序,因而可以将两个字符串都进行排序,调整到同样的顺序后进行逐一比较。class Solution { public char findTheDifference(String s, String t) { // 转化为char[]是为了调用Arrays方法类中的排序原创 2021-03-17 10:06:27 · 102 阅读 · 0 评论 -
290.单词规律:双哈希映射
LeetCode.290 单词规律 (Easy)这里参考借鉴的解法是力扣的官方题解,因为官方题解的代码可读性较差,我换了变量名并且加了很多注释。在本题中,我们需要判断字符与字符串之间是否恰好一一对应。即任意一个字符都对应着唯一的字符串,任意一个字符串也只被唯一的一个字符对应。在集合论中,这种关系被称为「双射」。本题需要为pattern中的每一个字符建立一个到给定字符串s中每一个单词的映射关系;同时反过来也需要建立一个映射关系。两个相向的映射关系正好构成一个双射,一旦发射不满足双射的冲突,立即返回f原创 2021-03-16 18:37:37 · 182 阅读 · 0 评论 -
142.环形链表2:快慢指针
LeetCode.142 环形链表2 (Medium)这里分享一个LeetCode上的:图解,非常便于理解。该题是基于环形链表:判断是否有环,并找到环的具体位置(返回环开始的节点)。同时本题需要一点数学和图像上的推导,来证明某一个点就是环起始的位置。第一步和环形链表一样,先通过快慢指针判断是否有环,并找到快慢指针相遇的位置。此时假设:慢指针走了k步。则:快指针走了2k步,快指针走过的距离减去慢指针走过的距离是k步,即为环周长的整数倍。此时假设:快慢指针相遇点距离环起始位置的距离m,则从head原创 2021-03-09 09:42:25 · 105 阅读 · 0 评论 -
47.全排列2:回溯算法
LeetCode.47 全排列2 (Medium)回溯算法的核心主要是四步:在for循环之前做“判断”在for循环里面做“递归”在递归之前做“选择”在递归之后做“撤销”这道题区别于全排列1的地方在于:给出的选择中存在重复元素。因而不能简单使用path.contains(nums[i])来判断一个元素是否已经添加过,因为不管是同一个元素还是值相同的,contains方法都会返回一样的结果(true),应当额外维护一个boolean类型的visited数组来记录选择中某个选择是否添加过。此外,原创 2021-03-09 09:38:44 · 96 阅读 · 0 评论 -
51.N皇后:回溯算法
LeetCode.51 N皇后(Hard)回溯算法的模板主要为4步:在for循环之前做“判断”在for循环里面做“递归”在递归之前做“选择”在递归之后做”撤销“本题倘若使用Java来写,鉴于Java的String无法修改,最好使用二维数组char[][]来构建棋盘,并在添加结果时再转为先转为String再加入List<String>再加入List<List<String>>。class Solution { // 所有棋盘的列表(最终答案)原创 2021-03-09 09:33:16 · 80 阅读 · 0 评论 -
46.全排列:回溯算法
LeetCode.46 全排列(Medium)回溯算法的本质就是穷举,因而决定了他的复杂度是O(N!)。回溯算法的核心主要是四步:1. 在for循环之前做“判断”2. 在for循环里面做“递归”3. 在递归之前做“选择”4. 在递归之后做“撤销”class Solution { private List<List<Integer>> res; public List<List<Integer>> permute(int[] num原创 2021-03-09 09:27:23 · 295 阅读 · 0 评论