数据结构
文章平均质量分 61
xxx_520s
这个作者很懒,什么都没留下…
展开
-
leetcode上两个字符串之间的动态规划类题目
一般我们都知道给定一个字符串s,当我们固定以当前索引i为子串的结尾时,则这种固定方法一共有n种,假设我们称这N个子串为;一般字符串之间的动态规划涉及到两个字符串,且涉及到S的结尾子串和T结尾子串的转换问题,那么两个字符串的所有一共有n^2级别的转换组合,且长度更大的结尾子串之间的转换一般会利用到短串之间的转换数值。所以这个时候我们定义的。原创 2024-01-20 15:36:17 · 483 阅读 · 0 评论 -
动态规划中如何利用map进行降维
利用前缀和求解的lc题目汇总,利用map进行dp降维原创 2024-01-12 19:10:26 · 444 阅读 · 0 评论 -
利用前缀和求解的lc题目汇总
前缀和是解决连续子数组的和的要注意map的初始化条件一般为map.put(0,1)表示考虑当前元素本身作为一个子数组符合对k的相关性质的情况。原创 2024-01-12 19:03:03 · 512 阅读 · 0 评论 -
在矩阵回溯中进行累加和比较的注意点
在回溯时,如果递归函数采用void返回,在入口处使用了sum变量,那么一般在初次调用dfs的地方,这个sum的初始值可能不是0,而是数组的对应指针的值,在比较操作的时候,需要在for循环开始之前进行,这样确保不遗漏corner case从代码中我们可以看到比较值更新msum(msum=Math.max(msum,sum+grid[nx][ny]);)的时机不对,如果有一个非0值的周围都是0值,那么这个值本身没有参与比较,即潜在的最大值可能被忽略原创 2024-01-12 13:18:28 · 477 阅读 · 0 评论 -
贪心算法的“左最优“与“右最优“及其对应的堆处理和预处理方法
在每一步选择中,总是选择最左边(最早出现的)可行的选项。在每一步选择中,总是选择最右边(最晚出现的)可行的选项。这两种策略是贪心算法中根据具体问题选择的不同方向。原创 2024-01-09 11:50:11 · 493 阅读 · 0 评论 -
leetcode网格题目中的上下左右四个方向和旋转90度的数量关系的代码表示
这里, 表示向上移动, 表示向右移动, 表示向下移动, 表示向左移动。1.2 方向数组的一维表示方法一维数组表示:另一种方法是使用一维数组结合模运算来表示方向。例如,可以定义一个一维数组 和 ,分别表示 x 轴和 y 轴的变化:这里的数组同样表示上、右、下、左四个方向。1.3 旋转的处理初始化方向:假设机器人最初面向北方,可以用一个变量 来表示当前方向,初始设为 (表示向右)。右旋转 90 度:向右旋转意味着 的值增加 1。可以使用模运算来确保 的值不超过方向数组的长度:左原创 2024-01-08 22:45:30 · 1170 阅读 · 0 评论 -
“分组循环“方式来对数组完成一次遍历【解题模板带你减少一半coding时间】
推荐大家记住。适用场景:按照题目要求,数组会被分割成若干段,且每一段的判断/处理逻辑是一样的。注:虽然代码写的是一个二重循环,但 i += 1 这句话至多执行 nnn 次,所以总的时间复杂度仍然是 O(n) 的。原创 2024-01-08 20:09:00 · 1047 阅读 · 0 评论 -
常见的并查集题目
并查集逻辑实现的优化有两种,第一种是查找时路径压缩,第二种是按秩合并,合并时将高度较小的树作为较高树的子树,从代码量来看,推荐使用路径压缩,可以参考lc 547. 省份数量的两种UnionFind写法。原创 2024-01-04 14:28:45 · 616 阅读 · 0 评论 -
leetcode上的“深拷贝类”题目
*int val;Node next;node=head;while(node!原创 2024-01-03 12:03:09 · 417 阅读 · 0 评论 -
leetcode中的状态机类型的题目
先是要确定新区间插入到哪一个位置(也有可能),插入后需要确定这个区间是否涉及到合并问题。所以我们可以设计一个flag变量,确定区间是否插入,插入完成则进行到区间合并阶段。原创 2023-12-23 12:03:18 · 474 阅读 · 0 评论 -
【面试常考题目】五种方法解决“如何在n个无序数组中找出它的中位数(java)”问题
合并的时候先将各个数组排序,然后采用n路归并的方式不断的将有序值取出(会用到数组指针,每一个元素对应其数组被取出元素的进度),直至取出到总长度的一半,时间复杂度为(n*logx)+O(TL),其中前者为各个数组的排序的时间复杂度之和(假设最长的数组长度为x),后者为这n个数组的总长度。这种方法的时间复杂度主要由优先队列的操作决定,即O(n log k),其中n是所有数组中总元素的数量,k是数组的数量。您的方法是一个有效的解决方案,它结合了排序和n路归并排序的思想来找到多个数组中的中位数。原创 2023-12-08 13:36:03 · 1021 阅读 · 0 评论 -
“快慢指针”思想在物理或者逻辑循环中的应用: 为什么用快慢指针而不使用set集合判定循环?
物理循环是指物理索引访问顺序上相邻,逻辑上也相邻,比如循环链表,逻辑循环则指物理的索引上不一定相邻。原创 2023-12-05 21:10:45 · 910 阅读 · 0 评论 -
如何判断一个题目用“贪心/动态规划“还是用“BFS/DFS”方法解决
一般能使用贪心、动态规划解决一个问题时,使用BFS,DFS也能解决这个题,但是反之不能成立。原创 2023-11-26 12:39:18 · 223 阅读 · 0 评论 -
leetcode中“辅助栈”类题目和“单调栈”类题目的异同
【代码】leetcode中“辅助栈”类题目和“单调栈”类题目的异同。原创 2023-11-25 15:38:53 · 158 阅读 · 0 评论 -
leetcode中“二分查找转化为判定问题”类题目
复杂二分题目-第 410、1011、1482、1552、1760、2187、2226 题。原创 2023-11-22 15:20:48 · 108 阅读 · 0 评论 -
Leetcode经典题目之“双指针交换元素“类题目
【代码】Leetcode经典题目之"双指针交换元素"类题目。原创 2023-11-19 16:05:18 · 837 阅读 · 0 评论 -
Leetcode hot100之“结合递归+二分“题目详解
题目 215 (“数组中的第 K 个最大元素”) 和题目 4 (“寻找两个正序数组的中位数”) 之间的联系主要体现在它们都涉及到寻找一个有序集合中的第 k 个元素的问题。尽管这两个问题的具体应用场景和所处理的数据结构不同,它们共享相似的算法思想和技术。原创 2023-11-16 16:05:09 · 397 阅读 · 0 评论 -
Leetcode hot 10之经典双指针问题:从《lc42 接雨水》到《lc84 柱状图中的最大矩形》
解法四:双指针动态规划中,我们常常可以对空间复杂度进行进一步的优化。例如这道题中,可以看到,max_left [ i ] 和 max_right [ i ] 数组中的元素我们其实只用一次,然后就再也不会用到了。所以我们可以不用数组,只用一个元素就行了。我们先改造下 max_left。我们成功将 max_left 数组去掉了。但是会发现我们不能同时把 max_right 的数组去掉,因为最后的 for 循环是从左到右遍历的,而 max_right 的更新是从右向左的。原创 2023-11-15 10:27:13 · 116 阅读 · 0 评论 -
聊聊leetcode可包含重复数字的序列的《47. 全排列 II》中的vis标记函数
满足其中任一个都可以跳过当前元素的遍历,我们都知道第一条件是用于判断向下遍历时,当前准备选取的元素是否已经在路径中,如果used[i]==true,则跳过;这个代码,我们都知道dfs函数会对used[i-1]进行回溯,当我们横向遍历到第i个元素时,则used[0…,导致去重操作也发生在了纵向遍历的过程中,当遍历到第二个1时,used[0]为true或者false都不重要,都会因为。才会仅仅在横向判断的时候起作用,如果不带这个,那么这个去重代码还会在纵向遍历的时候起作用。当然不能,因为只有带上这个,原创 2023-11-13 10:48:48 · 100 阅读 · 0 评论 -
Leetcode139单词拆分及其多种变体问题
背包问题通常都是组合问题,这其实是一道“”面向目标值的排列问题“,具体和背包问题有什么不同可以参考我下面写的这篇文章。原创 2023-11-12 13:45:55 · 148 阅读 · 0 评论 -
“面向目标值的排列匹配“和“面向目标值的背包组合问题“的区别和leetcode例题详解
因此,虽然从目标字符串s的角度来看,LC139 “单词拆分” 涉及到字符的排列,但在解决问题的算法层面,它更像是一个组合问题。这是因为我们关注的是如何从字典中选择单词来构造字符串s,而不是这些单词的选择顺序。原创 2023-11-11 23:07:30 · 1368 阅读 · 0 评论 -
链表扁平化类题目:从《lc114. 二叉树展开为链表》到《lc-LCR 155二叉搜索树转化为排序的双向链表》
进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?原创 2023-11-04 12:54:24 · 132 阅读 · 0 评论 -
系统设计类题目汇总五
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。原创 2023-11-03 11:40:46 · 96 阅读 · 0 评论 -
面试常考:从lc24《两两交换链表中的节点》 到 lc25《K 个一组翻转链表》带你认识链表递归
下面的三行注释要理解透彻,原创 2023-11-03 10:33:15 · 159 阅读 · 0 评论 -
多种方法解决leetcode经典题目-LCR 155. 将二叉搜索树转化为排序的双向链表, 同时弄透引用变更带来的bug
数组在Java中是一个对象,当你将数组作为参数传递给一个方法时,你传递的是数组对象引用的副本。你可以在方法内部修改数组内容,这些修改会反映到方法外部。这段代码实际上是一个常见的算法题目的解法,目标是将一个二叉搜索树转换为一个排序的双向链表。整个过程是通过中序遍历来实现的,遍历过程中修改节点的左右指针来构建双向链表。这意味着当你将一个对象作为参数传递给一个方法时,你实际上是将对象引用的副本传递给了方法。方法内部更新数组的内容,这样就能够实现在方法调用后更新外部的。方法时,你传递的是引用的副本。原创 2023-11-01 11:38:41 · 662 阅读 · 0 评论 -
回溯算法入门级详解 + 练习(持续更新)
https://leetcode.cn/problems/permutations/solutions/9914/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/原创 2023-10-31 11:32:51 · 63 阅读 · 0 评论 -
单调队列和单调栈
这种涉及到维护子数组的最大/小值的操作,一般都会是1 剑指 Offer 59 - II. 队列的最大值2 239. 滑动窗口最大值3 1438. 绝对差不超过限制的最长连续子数组。原创 2023-10-29 12:21:39 · 120 阅读 · 0 评论 -
从lc560“和为 K 的子数组“带你认识“前缀和+哈希表“的解题思路
LeetCode上有一道题目和“560. 和为 K 的子数组”在解法上非常类似,那就是“437. 路径总和 III”。这道题目是关于二叉树的,要求找到二叉树中和为K的路径的数量。其解法也是利用前缀和和哈希表。下面两个回溯代码有啥区别?原创 2023-10-28 22:01:57 · 333 阅读 · 0 评论