- 博客(13)
- 收藏
- 关注
原创 【力扣56】合并区间
在机试的时候我在思考两个不相交的区间被一个新加入的区间连接起来的情况,这样要讨论的东西非常多;只有两个区间的情况是比较简单的,但是不知道谁左谁右还是比较麻烦,按照左端点对区间排序确实是一个非常好的方法,一下子确定了比较的顺序,并且不存在两个分割的区间被新区间连接的情况。以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
2025-08-14 21:50:30
280
原创 【力扣322】零钱兑换
动态规划方程:dfs(i, n) = min(dfs(i-1, n), dfs(i, n-coins[i]) + 1);计算并返回可以凑成总金额所需的 最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。dfs(i, n):前i种面额的硬币凑成金额n的最少硬币个数;选第i种:dfs(i, n-coins[i]) + 1。不选第i种:dfs(i-1, n);你可以认为每种硬币的数量是无限的。
2025-08-14 18:32:48
176
原创 【力扣494】目标和
有t = p-(s-p) = 2p-s,即p = (s+t)/2;这里的s和t都是固定值;用子集法,选or不选变成了正or负,BFS执行所有情况,判断恰好为目标和。设所有数的和为s,取正的和为p,则和为p-(s-p);dfs(i, c):前i个数中恰好和为c的方案数;选第i个,前i-1个和c-nums[i];这样把问题转换为了选or不选。不选第i个,前i-1个和为c;暂时没看出来哪错了,,,
2025-08-12 23:35:33
173
原创 【力扣198】打家劫舍
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。偷第i家,第i-1家不能偷,第i-2家偷不偷都无所谓,即dp[i-2]+nums[i];dp[i-1]如果偷了第i-1家,则dp[i]不能偷第i家;如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。不偷第i家,第i-1家偷不偷都无所谓,即dp[i-1];设dp(i) 表示偷窃前i个房屋得到的最高金额。
2025-08-10 18:17:02
193
原创 【力扣46】全排列非递归实现
由于最小字典序是数字按照从小到大按从左到右的顺序排列,左边的数位是高位,会带来更大的影响,因此要得到不那么大的数要从右边的低位开始,但不能选择左边高位放置的小数,因为一旦选了,左边的高位会被大数替换,带来更大的影响,因此只能从右到左寻找下一个不同的数,并且选择的数位要尽可能接近,尽可能靠右。全排列中第二大的数:在最小字典序基础上,交换最低两位(不同的数);(i右边至少是降序,找到可替换使得高位更大的最小数)最小字典序:将最小的数放在最低位,递增地向后排列;(将替换的高位后面的部分转换成最小字典序)
2025-08-10 17:17:12
213
原创 【力扣46】全排列
给定一个不含重复数字的数组nums,返回其所有可能的全排列。或者可以用标记数组,标记已选择的位置。按照灵神思路分析 选择 和 子问题。选择x以后,在s-{x}中继续选择。
2025-08-09 22:18:18
172
原创 【力扣22】括号生成
数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。❌ 嵌套的情况应该是在剩余部分最外侧嵌套,这种写法会导致下次递归会在嵌套外侧修改。path设置为string类型,排列的情况只需path = () + path;嵌套的情况:front = front+(;嵌套的情况:path = ( + path + );设置前front,待定path,后back三段;排列的情况:front = front+();括号的两种关系:排列,嵌套;无法构造 (())();
2025-08-08 20:55:35
354
原创 【力扣216】组合总和3
可以结合之前的子集dfs,只将满足长度为k且sum为n的path加入ans。重要的依然是sum+i作为参数传递给dfs进行下次递归,不能改变sum的值。返回所有可能的有效组合的列表。从k的角度构造,思考起来很复杂。每个数字最多使用一次。
2025-08-08 17:10:40
249
原创 【力扣77】组合
1 可以在dfs定义的for循环中设置指针变量的不同结束位置,2 也可以直接判断长度=k时才将path加入ans,2这种情况我们关注若用完了n个数但长度未达到k该如何处理,我们选择直接return;给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。供选择的有n个数,n-k+1是最后一个长度为k个数的区间的左端点;第二层dfs(选择组合中的第二个数)最多选择n-(k-1)+1;以此类推,第n层dfs最多选择我n-(k-n+1)+1;dfs,终止条件是长度达到k;
2025-08-08 15:07:08
252
原创 【力扣131】分割回文串
边界:start from 0 to str.size()-1 每次切后,0-start归左半部分,start+1-end归右半位置。讨论第二刀时应从start+1开始;我们希望在讨论过所有位置以后终止,即完全不切,第n刀切后,s.size()-1位于左半部分末尾,而右半部分为空,此时下次调用dfs传入的start是s.size()。start是每次切后左半部分的末尾,下一次的start会是start+1,即右半部分开头;循环中递归dfs是在第一刀的基础上讨论第二刀,从start+1开始,直到末尾;
2025-08-07 22:05:40
206
原创 【力扣78】DFS构造子集
给你一个整数数组 nums ,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。还是得吃点细糠,难得的明白人写出来的好教程。
2025-08-07 00:48:13
198
原创 【力扣814】二叉树剪枝
父节点收到左右孩子的标志以后,若某个孩子所在的子树不含1,则将这一路设置为nullptr,再检查自己的val是否为1,若不为1,则给自己的父节点返回不含1的标志,否则告诉自己的父节点自己有1,此时这个节点的左右孩子中不含1的子树已经设置为nullptr,达到了一种传递的效果。注意节点的val是0或1的区别:在左右子树都不包含1的情况下,若父节点不为1,则一起删除,否则保留父节点。父节点同样给自己的父节点返回一个类似的标志,这个操作对所有节点都是一样的;左右子树都为0,自己为0,返回nullptr √。
2025-08-06 18:16:30
205
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅