- 博客(48)
- 收藏
- 关注
原创 代码随想录训练营Day27:贪心算法05区间问题
思路:可以延续前面的引爆气球的思路,所以本题的贪心策略为:对于相同起始位置的,删去终点位置靠右的,只留下一个最靠左的。对于具有不同的起始位置的,但是存在重复的情况(即当前的left与前面的那个的right具有重复的地方),谁的更加靠右删除那个。最后就是如果无重复就不管了。
2024-05-09 23:21:11
302
原创 代码随想录训练营Day26:贪心算法:04
贪心策略:先找大钱,再找小钱,20的不参与找钱思路:用five,ten存放5元和10元的个数,初始化都是0,如果给的钱是5元,直接five++,如果给的是10元,只能找5,判断此时有没有5,有就找,没有就返回false,如果给的钱是20,分三种情况,1:有10元先找十元再找5元。2.没有10元,找三个5元。3.如果5元,10元都不够,返回false.
2024-05-08 16:45:59
436
原创 代码随想录训练营Day25:贪心算法:加油站、分发糖果和K次取反的最大数组和
贪心策略:先按照绝对值的大小进行排序,绝对值大的排在前面,然后按照顺序,如果存在负值就翻转直到用完k次,或者遍历完之后,将最小的那个进行翻转即可。
2024-05-07 19:32:50
346
原创 代码随想录训练营Day22:回溯算法解决 重新安排行程、N皇后、解数独
这次的三个题目都是属于比较难的题目,也比较难想到相应的解决方法,需要经常复习。
2024-05-04 11:57:57
501
原创 代码随想录Day21:回溯算法解决子集和排列问题
在这个地方直接按照回溯算法三部曲的方法解决。需要注意的地方是result.push_back(path)的位置,为什么放在最前面呢,而不是放在这个下面的if语句呢?因为对于子集问题,我们需要的是树上节点所有的位置,前面的组合和分割问题是只需要叶子节点的位置,所以把这句话放在if语句里面。
2024-04-30 11:40:40
359
原创 代码随想录Day20:回溯算法解决切割问题
循环的输入参数:result,path,s为常规的输入参数,left,right可以合并为一个startindex,也是常规的一个输入参数。3.有两种方法来进行添加,前面那种是用一个新的path来存储,第二种就是直接在S中进行操作然后添加到result中。1添加了一个dotnum来确定添加了几个段,作为最终的一个终止条件。循环内的条件:需要先确定这一段是一个回文串,才能进行回溯算法。2.用isValid来判断这段是否满足为一个0-255的数字。类似于前面的分割回文串,但是分割的条件发生了改变。
2024-04-29 16:22:53
215
原创 代码随想录Day19:回溯算法2
思路:首先来说想到回溯算法可以解决组合问题,所以首先想到的就是一个回溯算法,按照回溯三部曲进行操作。其次看到里面的只能使用0-9和每个只能使用一次,所以可以对其进行剪枝操作减少对应的工作量。即确定当前到9的数的个数总和是否满足条件。剪枝:就是根据自己的一些提前的预处理,确定哪些一定是不能满足的条件,从而减少相应的一个工作量。
2024-04-28 23:09:11
628
原创 代码随想录训练营Day18:回溯算法
也可以叫做回溯搜索法,是一种递归的搜索算法。回溯算法的本质是一种递归算法,是一种暴力的递归方法,所以算法的复杂度比较高,唯一能做的就是剪枝来减少操作。回溯算法我们可以理解为一种树形结构,深度代表的是递归的深度,集合的大小代表宽度。回溯算法的基本的结构void backtracking(参数):这个里面的参数通常是result:最终的结果,path:一条路径的结果,index:一般用于遍历集合,还有一些其他的参数,具体需要根据实际在编写的过程中改写。if(终止条件){//或者其他操作return;
2024-04-26 21:48:32
323
原创 代码随想录训练营Day17:二叉树暂时完结
1.二叉树,搜索二叉树,平衡二叉树不同的性质。可以根据对应的性质来降低操作的复杂度。2.深度遍历和层次遍历的统一方式。3.构造二叉树。4.删除节点。5.查找公共祖先的问题:如何向上递归:回溯算法。
2024-04-25 23:35:51
417
原创 代码随想录Day15:搜索二叉树
所以可以把搜索二叉树和中序遍历进行相结合得时候,那么此时遍历输出的数组就会是一个单调递增的数组,从而更好的帮忙解决关于搜索二叉树的题目。
2024-04-23 22:48:51
275
原创 代码随想录训练营Day14:二叉树03
树左下角的值,首先得条件就是要在最下面这一层,其次就是这一层的最左边,所以这个题目和层次遍历的方式很匹配。思路:按照层次遍历(广度)即可,稍微修改一下,每次result只取最左边的那个值,然后更新到最后就是树左下角的值了。
2024-04-22 20:15:17
405
2
原创 代码随想录训练营Day13:二叉树的广度遍历
广度遍历我们所运用的就是一个队列的方式进行遍历,因为队列的先进先出的方式比较符合一个逐层遍历的方式每一次压入队列的就是一层的元素,我们分成两层循环,第一层循环判断这个队列是否为空,第二层循环用于遍历这一层的所以有节点。具体的操作流程:首先是先将头结点压入,然后判断是否为空,如果非空,确定当前对应的队列的一个长度,根据这个长度来遍历这一层的值。为什么这个长度就是这一层的结点个数呢。
2024-04-18 22:07:42
447
原创 代码随想录训练营Day12:二叉树的遍历:144、94、145
那么对于这个三种不同的遍历方式,递归也有所不同。唯一不同的就是对应的一个每一层的递归逻辑。
2024-04-16 16:47:51
306
原创 代码随想录训练营Day11:栈和队列
思路:我们使用大根堆的优先队列存储窗口长度为k的数据,此时最大的那个数就位于top,注意:优先队列里面存储的一个数据对,存放的是《值,索引》的方式存储,先将最新的那个存入之后,判断此时的top是否位于里面(即q.top().second<=i-k),如果不位于里面,那么使用while的方式将不在里面的大的值弹出,此时那个位于里面的top值就是最大值。思路:分成三个部分,第一个部分用于统计每一个数的频率,使用哈希表来存储;第二个部分使用大根堆进行排序,将最大的 k 个存入到大根堆里面;第三部分用于遍历输出。
2024-04-15 19:38:37
204
1
原创 代码随想录Day10:栈与队列2
思路:栈存放表达式的值。在遍历的过程中如果遇到了运算符,将栈上面的两个元素取出,计算出此时的表达式的值,再存入栈。如果遇到了数字,直接存入栈即可。思路:字符匹配,根据新来的是不是和最近的那个是不是相匹配的方式来确定是否有效,这就和栈的思路很相匹配。最后的栈里面存放的就是不相邻的重复项,最后遍历放到string中即可。第二种全部遍历完成之后,栈如果不为空,那么就是不匹配。入栈的方式:该栈为空或该栈的顶不等于当前遍历的值。出栈的方式:如果该栈的顶等于当前的遍历的值。匹配:全部遍历完成之后,栈为空。
2024-04-13 22:36:47
253
原创 代码随想录Day9:栈和队列
注释中使用的是两个队列来完成入栈和出栈,对于出栈的时候,我们先将出队列的元素存放到另外一个队列中,然后留下最后一个,出队列即为我们需要的那个元素,然后将另外一个队列的元素重新压回队列,并清除另外一个队列里面的元素(保证代码的一致性,如果你不重新压回去的话,你下次就不知道到底是向哪一个队列入栈,哪一个队列出栈)。出栈的时候,将出队列的元素重新又压入队列同时进行类似于循环队列,我们只需要将需要的那元素放到队列最前方再出队列即可,那么此时移动的次数正好就是队列的长度-1(queue.size()-1)。
2024-04-12 10:54:52
470
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人