- 博客(187)
- 收藏
- 关注
原创 LeetCode337周赛T4 -- 同余
我们只需要知道一个概念:“同余”。知道了这个点,那么题目就很好做了。,判断有没有余数与它同余的。那么我们只需要依次遍历。
2025-04-02 10:42:21
303
原创 Leetcode 6207 -- DP | 思维 | 双指针
我们可以把原数组看作由被不在[minx,maxn]范围内的数分隔的多个子数组,那么问题就转换成了如何在一个子数组中。方法很简单,枚举右断点就可以了。然后,如果我们希望我们的子数组的个数尽可能的多,那么左端点应该尽可能靠近右断点。思维本质上就是一个优化的双指针,所以这里只分析双指针。dp的思路真的太妙了,第一次看见这种思路。的找出所有满足要求的字数组。
2025-04-02 10:41:51
105
原创 LeetCode354 -- 最长上升子序列
因为我们按照左端点排序的,所以左端点肯定是升序(⚠️不严格升序)的,出于贪心的角度,我们肯定希望右端点越小越好,这样后面的区间就更容易合法。这样就可以完全避免左端点相等时多次选取的情况,因为如果左端点相等,那么右端点大的总是先出现,它先出现就会导致下一个区间的右端点匹配失败,之前都是直接排序,而无论是左端点优先还是右端点优先,假设左端点优先吧并且一般都是升序,我们一般是让右端点也升序的。只保存了右端点啊,如果你想要比较左端点,你就需要再保存它,那不就会到上面的讨论了吗?时,左右端点的最小值。
2025-04-02 10:41:20
481
原创 O(1) 时间复杂度数据设计题
对于一个操作,可以分摊的前提是,你这个时间复杂度很高的情况只会执行常数次,那额,分摊到你每一次执行,就是常数+常数还是常数级别,只不过常数比较大罢了。不是的话就麻烦了啊,如果它在队列的中间,难道我们要把它之前所有元素取出来,在删除它,再把拿出来的元素再放回去吗?维护队列的最大值我们很容易想到滑动窗口,对于滑动窗口来说,我们可以很容易的维护不断添加元素时的最大值,但是当删除元素时,最大值该怎么维护呢?如果原队列当前删除的元素不是队头的话,说明,后面肯定有比它大的元素入队,并且作为队头,这意味着什么?
2025-04-02 10:40:39
170
原创 LeetCode1024 -- 二分
确实,二分其实是可行的!只不过我们要变换一下二分的条件,将“查找是否有满足条件的长为。其实我们是很容易想到二分的,但在这里,二分有一点小小的问题!这样,我们就能保证二分的连续行了!的区间”改为“查找是否有满足条件的长大于等于。,然后遍历整个区间,查找是否有满足条件的长为。的区间,因此,不具备连续性,也就不能二分。的满足题目要求区间,一定有长度为。的区间,一定存在长大于等于为。,那么,就是求最大的子区间。的满足题目要求的区间吗?其实是不满足的,例如,样例。的区间,却不存在长度为。的区间,显然成立的!
2025-04-02 10:40:17
568
原创 SET_链表
的最大值,但是并没有一个函数可以快速求出小于等于。的上一个数(更小的数)一定是 小于(等于)立马看出题目让我们求的是满足大于等于数。由此想到二分,可以利用。(小于x的最大的数) 的时候,我写了。的最小的值,或者小于等于数。(大于x的最小的数) 求。中,我们可以利用函数。的最大的值,或者通过。实际上,我们可以通过。
2025-04-02 10:37:58
296
原创 n数之和问题
两数之和 II - 输入有序数组 https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/solution/san-shu-zhi-he-bu-hui-xie-xiang-xiang-sh-6wbq/三数之和 https://leetcode.cn/problems/3sum/solution/shuang-zhi-zhen-xiang-bu-ming-bai-yi-ge-pno55/
2025-04-02 10:37:28
120
原创 LeetCode435 -- 预定会议问题
问题,而且由于区间之间不是严格大于的原因,为我们避免了不必要的麻烦!为什么要按照右端点排序?做法:贪心,按**【右端点】**排序。如果按照左端点升序的话,那么答案就是。了,但显然,答案应该是。
2025-04-02 10:36:57
533
原创 Leetcode 6233 -- DFS序列 | 两遍DFS
解释一下第二次 $DFS,如果我们删除了某一个节点和它的子树,那么此时树的最大高度就是在继续。给定一个序列,每次删除一个连续区间,求序列里剩下的数的最大值。显然删除一个连续区间后,序列会剩下一个前缀以及一个后缀。序里的一个连续区间。对于树的题目,学习到了一种新的算法(思路) –的过程中是无法知道这个值的,所以我们要在。)来表示遍历到当前节点之前,树的最大高度。时,我们就要更新这个值。求“删除”该节点后的最大高度。的参数中维护这个值(
2025-04-02 10:36:25
486
原创 Spfa求负环
求负环的常用方法,基于SPFA,一般都用方法2方法1:统计每个点入队的次数,如果某个点入队n次,则说明存在负环方法2:统计当前每个点的最短路中所包含的边数,如果某点的最短路所包含的边数大于等于n,则也说明存在环。
2025-04-02 10:34:35
427
原创 程序员面试金典 17.18 -- 摩尔投票法
如果存在这么一个数,他的出现次数超过数组大小的一半,也就是说,他出现的次数之和大于其他元素的出现次数之和。这种找**“数组中出现次数超过一半的元素”**的题目的算法是固定的 – 摩尔投票法。另外需要注意,如果数组中不存在这个数,那么最终的结果是随机的。那么将这个数和其他数两两抵消之后,最后剩余的数的集合一定是它本身。设置一个候选人(数组中出现次数超过一半的元素)
2025-03-29 09:49:23
302
原创 二维数组和坐标系的对应关系
只不过是符号而已,下面的对应关系也没错。如果非要使用第二种方式,需要将下面代码的。只不过,我们一般用的时候,是将。当然,这个对应关系并不是死的,, 因此第一种方式更符合直觉。
2025-03-29 09:48:41
387
原创 二分图问题
最大边匹配:选出最多的边,使得这些边没有公共点最小点覆盖:选出最少的点,使得图中每一条边都至少有一个顶点被选最小路径覆盖:选出最少的互不相交(点不重复)的路径,将所有点覆盖(路径长可以为0,即单个点的情况)(一条路径可以包含多个点,例如1->3->4我们视为一条路径,这条路径包含了三个顶点134最小路径重复点覆盖:在最小路径覆盖的情况,去掉互不相交,例如(路径1->3->4和路径1->3->5,它们是相交的,交点是3。
2025-03-29 09:48:37
545
原创 背包九讲【DP】
麻烦的点在于,对于不同的背包模型,我们的存放数据的类型是不一样的,例如,存放分组背包和普通背包的体积的价值的数组,一个是一位数组,一个是二维数组。背包都一样,都是借用上一层的状态转移,由于我们的体积是倒序枚举的,而费用那一维在体积之后,因此只需要倒序枚举体积即可确保状态是从上一层转移的。对于分组背包问题,有一个细节点,就是对于每个组内的物品,是放在体积之前遍历,还是放在体积之后遍历,还是都可以呢?),就相当于我们已经在当前层包括了不选当前组中的物品的情况,也即此时组内物品都不选的情况,这显然是不合法的。
2025-03-29 09:44:53
524
原创 背包问题 | 方案数 | 具体方案
而当物品体积不等于价值时,装满并不意味着就取得了最大价值,此时我们需要一个数组来专门记录这个最大价值,因为状态转移过程中需要用到。之所以有这样的不同是因为,在求装满时的方案数时,体积等于价值,由于任意转移过程中最大价值就等于此时的体积,因此我们无需专门的。还有就是需要注意,在装满背包求方案数问题当中,只能初始化。求恰好装满的方案数与最优选法时的方案数的做法大不相同。来求,但求最优选法时的方案数是跟踪记录。时,我们什么都没法选物品,是一种方案。时,我们没物品可选,这也是一种方案!数组的含义清楚的看到,前者。
2025-03-29 09:44:22
629
原创 根据合法性边的权值视为0/1
求最短路,将需要升级的边的权值看作。,这样求得的最小值就是需要升级的次数。,不需要升级的边的权值看作。思路:二分枚举答案 +
2025-03-29 09:43:38
549
原创 迭代加深 & IDE*
首先,它是深度优先搜索,其次它与普通深度优先搜索不同的是,每次深搜都会有搜索的最大深度限制,如果没有找到解,那么就增大深度,再进行深搜,如此循环直到找到解为止,这样可以找到最浅层的解。while(!IDA*,即基于迭代加深的A*算法IDA*实质上就是对迭代加深加了一个启发式的剪枝。
2025-03-29 09:43:06
1007
原创 次短路问题
要么是满足最短路要么满足次短路),然而事实是,次短路和最短路都可能用来更新其他节点,因此我们需要。中次短路也满足拓扑序,因此我们可以用。的次短路,如果不拆点的话,那么每个。只会出队更新其他节点一次(即。不满足拓扑序,除非我们先用。的问题,注意不能直接用。预处理,但那样太麻烦。
2025-03-29 09:42:27
362
原创 回溯去重【去重问题】
在解决去重之前都一般都需要排序,并且还需要在搜索的时候使用一个参数 startIndex,判重的时候使用一个数组 used。注:组合不要求顺序,排列问题要求顺序。例如:{1,1,2}和{1,2,1}是同一个组合但不是同一个排列。排列问题在树层和树枝上去重都可以,其它只能在树层去重。排列问题:N个数按一定规则全排列,有几种排列方式。子集问题:一个N个数的集合里有多少符合条件的子集。组合问题:N个数里面按一定规则找出k个数的集合。切割问题:一个字符串按一定规则有几种切割方式。重复分为树层重复和树枝重复。
2025-03-29 09:40:11
247
原创 剑指Offer140【DP】
因为两段肯定包含三段,四段的情况,而三段不可能包含两段的情况,除非你划分一个。,NO NO NO,不是这样的!(当然,样例够用就行)的绳子划分之后的最大长度,看看有没有什么规律。为什么是划分为两段,而不是三段,四段。这题的思路还是比较简单的,就是划分子区间,一个长度为。,可以看出,它不划分时的乘积更大!作为被划分的子区间时才可以不继续划分,如果。了,同理,四段不可能包含两段和三段的情况。,我们是必须要划分的,但是划分之后的长度。,可以发现,他们划分之后的长度不是。,可以划分,也可以不划分!
2025-03-28 19:03:32
662
原创 剑指Offer26 -- 树
当然,爆搜归爆搜,不要忘了剪枝。小小的剪枝大大的优化。有个小优化,那就是在枚举每个点,并以当前点搜索的时候,要保证。相等,否则就不搜,这样可以节省很多时间。,当已经找到后,后面的就不着了,提前结束。另外,将是否找到作为一个全局标记。中的每个节点,对于该节点。2.好像没有优化的做法?
2025-03-28 19:02:58
526
原创 剑指Offer35- - 链表
思路呢,也很简单,既然随机指针可能指向一个还未创建的节点,那么我们就先创建它,然后通过哈希表存起来,并与原链表的相应节点做映射。这样,当我们下次遍历到这个随机节点时,我们可以检查一下哈希表,看看是否已经建立过了,避免重复创建节点。注意在计算空间复杂度时,是不考虑创建新链表产生的空间的,因为那是必须的,我们主要考虑的时。首先,这题绝对没你看上去的那么简单,复制链表?本题有一个有意思的地方,就是它有一个随机指针,随机指针以为着什么?因此说,我们不能直接遍历链表,来创建新链表,需要一些特殊方法。
2025-03-28 19:01:11
1014
原创 落谷 R94951828 -- 位运算|质数|思维
所以我们预处理所有质数它们的最高位是哪一位,并开个桶记录一下,对于每个询问把。的二进制中的每一位,当且仅当。的二进制中最高位是第。那么题目就转化为了求。
2025-03-28 19:00:41
855
原创 落谷 R94681591 -- 并查集+离线算法+倒序处理
因为更改点的权值不会改变树的结构,但是删去一条边会改变树的结构,不同与增加一条边,删除一条边的处理是很麻烦(没实现过!3.另外就是由于我们是倒着处理,因此需要倒着输出答案。(倒序处理基本都是需要倒着数处答案的吧!,因为我们的的本意只是修改节点的权值,但是我们把整颗树的权值修改了!(体现在代码中就是并查集的根),如果我们直接修改。这类问题的通用解法是:先保存删边,然后倒叙处理。2.关于节点权值的修改,我们需要一个额外的数组。既然我们无法删除一条边,那么我们可以倒着加边!开始了),但我代码中边的下标从。
2025-03-28 18:59:45
736
原创 剑指Offer49 -- DP_贪心
其实呢,这题,想到是不太好想,看别人的分析也不太容易看懂,但是看代码就一看就懂了。其实这题,就像贪心,因为丑数只能从另一个丑数通过(pre都是丑数),的方式得到,因此,找出nnn个丑数时很容易的。难点在于,如何保证这nnn个丑数恰好是最小的nnn个呢?贪心呗!如果,我们希望通过得到的丑数尽可能的小,那么,当然也要尽可能的小,那么,我们就每次枚举最小的pre。如果使用过了,就要增大pre,并且我们希望增大的幅度近可能的小,那么与preprepre。
2025-03-28 18:58:12
720
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人