- 博客(90)
- 收藏
- 关注
原创 算法-贪心篇13-无重叠区间
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。返回 需要移除区间的最小数量,使剩余区间互不重叠。注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。每当我们发现边界有重叠的时候,记录下上一个的左边界,然后假设删除这个区间,继续向前遍历;如果区间不再重叠,把这个区间保留,然后更新为新的左边界。从右边界进行排序,然后定左边界。
2025-03-09 19:53:29
200
原创 算法-贪心篇12-用最少数量的箭引爆气球
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。然后如果气球和下一个气球有重叠部分,把下一个气球的边界更新为两个气球的重叠区间,这样就省下了一根箭;给你一个数组 points ,返回引爆所有气球所必须射出的 最小弓箭数。
2025-03-09 19:15:54
198
原创 算法-贪心篇11-根据身高重建队列
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。然后我们遍历这个从高到低的序列,每次每个人他前面有 k 个比他高的人,然后放到第 k 个位置,因为后面再插入到他前面也不会影响到他的这个数据了。首先我们根据身高进行排序,高的在前面,如果一样高,前面比自己高的人少的在前面。
2025-03-09 18:56:46
262
原创 算法-贪心篇10-柠檬水找零
很简单,因为钱只有三种面值,我们只需要一个长度为三的数组来存储自己所拥有的零钱的数量就行。(其实两个就够了,因为找零只会使用到5和10,但是工程思想,都保存下来没毛病)如果你能给每位顾客正确找零,返回 true ,否则返回 false。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
2025-03-09 18:52:20
197
原创 算法-贪心篇08-加油站
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。再尝试从后向前跑,找到一个站,这个站的剩余油耗可以填补最小油量的损耗,说明从这里开始,可以完成一圈。在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。如果最后,最小油量不为负数,说明路上没有一次缺油,0就是答案;
2025-03-08 20:33:33
272
原创 算法-贪心篇07-K 次取反后最大化的数组和
情况三:k比负数的数量大,没有数据为0;如果剩下的次数是2的倍数,结果不变。如果剩下的次数不是2的倍数,在已经变完的数据中选一个最小的取反。情况二:k比负数的数量大,但是有数据为0;因为零把剩下取反的次数全部消耗完,取反不影响;选择某个下标 i 并将 nums[i] 替换为 -nums[i]。重复这个过程恰好 k 次。可以多次选择同一个下标 i。对数组进行排序,优先处理最小的复数;以这种方式修改数组后,返回数组 可能的最大和。情况一:k比负数的数量少,直接结束;最后,把数据相加得出结果。
2025-03-08 20:27:21
125
原创 算法-贪心篇05-跳跃游戏
优化非常好,之前暴力解法是551ms,击败了6.25%;这次优化后0ms,击败100%,成就感满满。这不就是算法的魅力吗?
2025-03-08 00:31:01
222
原创 算法-贪心篇04-买卖股票的最佳时机 II
很简单,只要相隔的两天股票是涨价我就买卖,如果是连续涨价可以看成中间那天我先卖后买,等于没有买卖就行了。然后就是求差值,把差值为正的加上就行,很简单的一题。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。返回 你能获得的 最大 利润。
2025-03-08 00:22:07
118
原创 算法-回溯篇13-N 皇后
其实这里都是回溯的标准模板,花了一些时间,还是可以做出来的。这道题目和数独很像,但是哪一题我用同样的思路会超时,我可能需要继续思考一下数独应该怎么解决。
2025-03-07 10:46:23
225
原创 算法-贪心篇03-最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。
2025-03-07 10:36:46
172
原创 算法-贪心篇01-分发饼干
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。如果没有分的这个最大的饼干不能满足没有分的小孩的胃口,那么就不给这个小孩分了(怎么感觉是在说找工作呢,胃口大了不是好事,你要顺位往下比别人强的同时还要看剩下的饼干是否符合你的条件。)因为当前情况下,没有合适的饼干给这个小孩了,就不管了。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。
2025-03-06 23:00:35
326
原创 算法-回溯篇12-全排列 II
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。在上一题的思路上数字有重复,多加上每层判断这个数字有没有在本层使用过即可。
2025-03-05 20:29:00
266
原创 算法-回溯篇11-全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。官方的题解使用了一个辅助数组,这样子可以省去很多内存,以及频繁创建和在数组中删除元素的开销。但是我每次需要重新生成一个新的数组,并且赋给下一层。每次选取一个数据,然后把该数据从数组中删除。1ms,不是最优的解法。
2025-03-05 20:11:50
198
原创 算法-回溯篇10-非递减子序列
本体最重要的是如何去重,这道题目中有一个测试用例{1,2,3,4,5,6,7,8,9,10,1,1,1,1,1}这里我们会发现,如果使用之前的去重策略,只能应对相同数据在一起的情况,这里多个1分布在不同的位置,不适用。那么我们需要用一个umordered_map来记录下这一层是否使用过(这里可能比较难理解)。
2025-03-05 19:57:50
220
原创 算法-回溯篇09-子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。就是在上一题的基础上,加入一个去重就行。
2025-03-05 19:13:25
234
原创 算法-回溯篇08-子集
每次进行回溯的时候,把一个标记index传入,然后从这里往后遍历,每次把一个数据放入路径中;给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。非常经典的回溯问题,就是按照模板去写就行。当index到最后了,把路径放入ans中。
2025-03-05 19:11:25
239
原创 算法-回溯篇06-分割回文串
给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。这里不同于前几道题目,思路改了一下;
2025-03-04 21:29:48
387
原创 算法-回溯篇05-组合总和 II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。相较于上一题,我们多了一个数据只能使用一次的限制,那么我们在数据的选取上就把已经试过的数据删除即可;candidates 中的每个数字在每个组合中只能使用 一次。注意:解集不能包含重复的组合。
2025-03-04 21:22:52
342
原创 算法-回溯篇04-组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。如果至少一个数字的被选数量不同,则两种组合是不同的。从大到小排序会让我们的数据选取更加具有目标性,可以减少很多不必要的路径试错。对于给定的输入,保证和为 target 的不同组合数少于 150 个。回溯就按照递归的模板来写,确定好回溯路径和结束条件就行。
2025-03-04 21:17:16
207
原创 算法-回溯篇03-电话号码的字母组合
这道题目我这种解法效率很低,应该是因为我使用了unordered_map并且没有剪枝,我在阅读了一些答案的写法,并没有看到明显的复杂度上的区别。
2025-03-03 20:02:19
299
原创 算法-回溯篇02-组合总和 III
返回 所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。这道题目其实数据量小,使用回溯主要还是为了学会它。每个数字 最多使用一次。
2025-03-03 19:54:23
322
原创 算法-二叉树篇27-把二叉搜索树转换为累加树
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。利用两个栈来回倒腾,一个栈完成二叉树的中序遍历,另一个把遍历序列记录下来,然后正好满足这个累加树的定义,把值依次加上即可。节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。
2025-03-02 21:59:42
369
原创 算法-二叉树篇26-将有序数组转换为二叉搜索树
很简单的遇到递归题目,对数组取半,然后构建中间节点作为该数组对应的树,然后左右两边切割数组递归下去。给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。
2025-03-02 21:52:23
351
原创 算法-二叉树篇25-修剪二叉搜索树
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在 唯一的答案。所以结果应当返回修剪好的二叉搜索树的新的根节点。和删除二叉搜索树节点的思路几乎一样,只是对于每个节点的处理做一些修改。当节点大于范围,把节点和右子树删除,返回处理后的左子树;当节点小于范围,把节点和左子树删除,返回处理后的右子树;
2025-03-02 21:49:35
180
原创 算法-二叉树篇24-删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。首先根据二叉搜索树的特性去寻找被删除节点;首先找到需要删除的节点;如果找到了,删除它。
2025-03-01 20:07:51
126
原创 算法-二叉树篇23-二叉搜索树中的插入操作
我感觉这个方法有点不太合理(必须值和树没有重复的,而且只能插在叶子节点处,虽然插入一个没有什么大问题,但是如果插入元素过多可能会导致树深度较大)解决的方法应该是调整改树,但是目前没有想到合适的方法来解决。给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果。
2025-03-01 19:17:13
335
原创 算法-二叉树篇22-二叉搜索树的最近公共祖先
这种公共祖先的题目,主要还是需要目标节点的路径,但是对于上一条来说,因为我们不知道目标节点的位置,如果存储下所有路径会占用很多内存,所以我们是采用递归的方式去反向遍历确定答案。这道题由于我们可以知道寻找目标节点的正确路径,所以我们可以直接存下该路径,减少了程序运行时不必要的时间开销。
2025-03-01 18:55:54
282
原创 算法-二叉树篇21-二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。其中当节点等于目标节点中任意一个时,把值加一,然后把左右子树递归的返回值加上,这个值就是用来记录的,而且可以拓展至n个节点的最近公共祖先。差点给我绕进去了,我的方法是递归遍历二叉树,返回值是找到了多少个目标节点,当第一次出现2时,把值归零。但是这个解法也是有局限性的,一方面找到公共祖先后仍然需要继续递归直至结束。
2025-03-01 18:33:29
257
原创 算法-二叉树篇20-二叉搜索树中的众数
这道题其实可以直接中序遍历然后结合数组找出众数即可,我是利用前k个高频元素来做,麻烦一些,但是可扩展性高,同时复习一下unorder_map,sort等用法,过了几天有点忘记了。给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 任意顺序 返回。结点左子树中所含节点的值 小于等于 当前节点的值。结点右子树中所含节点的值 大于等于 当前节点的值。左子树和右子树都是二叉搜索树。
2025-03-01 16:59:55
301
原创 算法-二叉树篇19-二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值。利用二叉树的中序遍历,吧序列存放在数组当中,然后逐差,得到最小值即可。差值是一个正数,其数值等于两值之差的绝对值。
2025-03-01 16:34:23
108
原创 算法-二叉树篇18-验证二叉搜索树
两种方法在性能上提交力扣后几乎一样,第一个递归在二叉树节点多时栈上数据多,而第二个需要一个额外的数组来存,然后再遍历一遍。二者在数据量不是特别大的情况下没有什么很大的开销,具体看大家的取舍了。
2025-03-01 00:40:03
243
原创 算法-二叉树篇12-找树左下角的值
力扣题目链接给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。
2025-03-01 00:37:56
306
原创 算法-二叉树篇17-二叉搜索树中的搜索
这道题目可以直接递归每个节点然后对左右节点比较大小,比较简单,所以我就当复习迭代法中序遍历二叉树了,可以不像我写的那么复杂。你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。关于中序遍历的方法,就是返回中序遍历的序列然后判断单调性即可,思路上也是比较简单的。给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
2025-03-01 00:27:36
225
原创 算法-二叉树篇16-合并二叉树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。把树2合并到树1即可,对于每个节点,我们合并数值给树1;对于树1和树2只存在一个的情况下,只返回存在的那个;给你两棵二叉树: root1 和 root2。注意: 合并过程必须从两个树的根节点开始。都不存在就返回null。返回合并后的二叉树。
2025-03-01 00:18:52
201
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人