- 博客(55)
- 收藏
- 关注
原创 day31 第八章 贪心算法 part05
"本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。" ---《代码随想录》思路:监控都不在叶子节点,所以从底向上遍历,后序遍历,分3种情况,最后根节点也要判断一下。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。
2025-04-29 16:31:41
743
原创 day30 第八章 贪心算法 part04
先准备一下每个字母的最大位置,以便后续继续计算。452. 用最少数量的箭引爆气球。435. 无重叠区间。763.划分字母区间。先排序,再算重叠区间。
2025-04-14 23:10:49
596
原创 day29 第八章 贪心算法 part03
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。“可以换一个思路,首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。每个加油站的剩余量rest[i]为gas[i] - cost[i]。要注意语言,尽量深耕一门语言。406.根据身高重建队列。
2025-04-14 15:38:21
384
原创 python进制转换
a = int(input(),2/8/16) 表示input()是几进制。bin(a)/oct(a)/dex(a) 表示十进制转2/8/16进制。
2025-03-22 17:16:28
135
原创 判断质数与合数
判断质数与合数的逻辑很相似,都是判断一个属除了1和它本身,能不能被其他数整除。质数除了2,3,能表示为6k+-1(k=1,2,...)质数2,3,5,7,11,13,.....规则)和范围优化(只检查到。),实现了高效的质数判断。该算法通过数学优化(
2025-03-18 23:58:47
355
原创 二分法总结
若非严格单调递增,不一定能保证找到第一次出现target的位置,但能保证能找到是否存在这个数。如果区间存在,找mid,判断大小,更新区间。若区间内单调递增,没有问题;
2025-03-10 16:36:28
240
原创 回溯问题总结
子集同一层有相同的元素,只算第一个,后面的都要去重。假设7xx7yyy,第一个7的子集树包括有xx7和没有xx7两种,没有xx7==7yyy,跟没有7xx一样。排列:没有start_index, 要从0开始;子集 = 每一层是组合问题,整棵树是子集问题。组合:用start_index。分割 = 组合+字符串判断。
2025-03-07 00:41:43
112
原创 day28 第八章 贪心算法 part02
按实际顺序从小到大排不好写代码,很长很烦。重点不是跳跃的方法而是可以跳跃的范围。1005.K次取反后最大化的数组和。122.买卖股票的最佳时机II。
2025-03-05 14:42:25
171
原创 day27 第八章 贪心算法 part01
山峰山谷,用贪心时间复杂度O(N),prediff>=0/<=0是为了把0引入,开始计算,不然后面没法算。前面所有的最大和如果<0, 只能给后面带来降低,所以舍弃,从0开始。排序,以饼干为中心,从大到小算。
2025-03-04 17:34:11
492
原创 day25 第七章 回溯算法 part04
求子序列问题跟求子集问题很像,但原数组各元素的位置不变,所以去重只能去元素内容相同的,也就是用unordered_set,求子集可以排序,用数组就行;去掉递减的,是跟上一级比。排列跟组合的区别:used数组;去重:同层如果排列到相同的数字,就跳过。491.非递减子序列。
2025-03-02 11:15:22
222
原创 day24 第七章 回溯算法part03
横向遍历是组合的个数,纵向是如何组成组合,(去重:1.组合去重通过start_index从i/i+1开始;每一层是该长度所有组合的可能,如第一层,取元素[1,n],第二层,如果取了1,从[2,n],如果取了2,从[3,n]。子集问题,整棵树,直到没地方展开,实际数学问题是有n个数,每个数取或不取有两种方案,所有不重复的方案就是子集问题。纵向伸展,为了避免组合重复计数,start_index从i+1开始,这是指树的纵向递归。组合问题,长度k,看每一层取数,如果数一样就跳过。
2025-03-01 12:54:33
201
原创 day23 第七章 回溯算法part02
分割问题跟组合问题一样,都是重叠子问题+记录path。注意定义好分割的区间。剪枝从元素个数和元素和入手,元素和用排序+剪枝,都是在for的结束上做文章。不允许重复元素,startindex从i+1开始。允许重复元素startindex从i开始。递归,for内部,纵向便利,控制组合内元素如何构成。不同集合,index(可以用for,不用用回溯)for循环,横向遍历,控制组合不重复;同一个集合,startindex。
2025-02-28 17:32:37
471
原创 day22 第七章 回溯算法part01
cpp里string可以用push_back(), pop_back(),也可以直接+递归的每一层for就是我们想写的每一层for,用if(终止条件)控制循环层数。剪枝2:i<=9-(k-(path.size()+1))和上一题一样。回溯本质是暴力搜索,复杂度没有变化,只能通过剪枝来减小一些复杂度。,如path,该状态只记录当前,通过回撤来消除下一层的东西。有未知层for,for写不出来,所以用回溯,也就是递归。跟77.组合问题不同的是:总和+[1,9]map的key,value用,隔开。
2025-02-27 23:01:07
354
原创 day58 第十一章:图论part08
先找到入度为0的节点,把这些节点加入队列/结果,然后依次循环再找。不能处理负权重,贪心算法,minDist表示距离。dijkstra(朴素版)精讲。
2025-02-23 20:26:07
303
原创 day56 第十一章:图论part06
1.入度为2:看删哪条边可以形成树,而不是环(因为只有两种可能,一个树,一个环)其实只有一条边冗余,改为,如果两条边在同一个集合里,就输出,不然加入。2.没有入度为2的点:有向环,删最后形成环的那条。109.冗余连接II。
2025-02-21 21:19:55
400
原创 day57 第十一章:图论part07
对所有边从小到大排序,如果这条边的两头不在同一个集合里,result加入这条边,集合中也加入这两个点。minDist表示不是生成树上的点到生成树的最小距离。从顶点的角度,按照贪心算法,一个一个加入生成树。inTheTree表示是否是生成树上的点。1.选取距离最小的点加入生成树。2.更新minDist。kruskal算法精讲。
2025-02-21 15:24:41
363
原创 day55 第十一章:图论part05
背景:判断连通性,即两个元素是否在同一个集合里/如何将两个元素放入同一个集合里。cin变成join,前面要init()原理:一维数组,用father连根。两种优化方式:路径压缩,按秩合并。不需要grid,变成father。
2025-02-19 20:32:51
385
原创 day52 第十一章:图论part03
dfs:两种写法:一种是进来之前就判断了,判断条件在dfs的for内部;另一种是进来没有判断,那么终止条件在dfs开头。bfs: 加进来的时候就变,不要等pop的时候再变。即两处append的地方,开头和for内部,都要同时加变化。dfs, bfs流程都差不多,主要看在图的处理上,怎么需要dfs,bfs。空间复杂度高了,可以不用新建一个list,而是把陆地改成2,dfs: 进入条件即退出条件,二者选一即可。,然后遍历,再把孤岛改成0,陆地改成1。101. 孤岛的总面积。104.建造最大岛屿。
2025-02-16 21:04:21
388
原创 day50 第十一章:图论part01
连通图(无向),强连通图(有向)----- 任意两个节点之间都可相互到达。邻接表和邻接矩阵dfs写法上没有太大差异。连通分量(极大连通子图),强连通分量。易于查找任意2个顶点之间的连接。邻接表:defaultdict。ACM模式,自己控制输入输出。不好搜索任意2点之间是否存在。邻接矩阵:n*n的矩阵。n*n,不适合稀疏图。回溯就是深度优先搜索。98. 所有可达路径。
2025-02-09 20:16:09
528
原创 day49 第十章 单调栈part02
接雨水:左右最高的柱子求面积:左右第一个低的柱子停止单调栈单调增/减,所以能求左右高/低的地方,栈内保存柱子的index。
2025-01-26 16:36:36
287
原创 day48 第十章 单调栈part01
单调栈:求第一个右边大的数,单调栈的逻辑就是先遍历,如果这个数比栈顶大,弹出,并记录这个弹出的元素的result,一直循环直到栈为空或这个数比栈顶元素小;如果这个数比栈顶元素小或相等,则加入这个栈。循环数组 -> 用2倍的len(nums)来处理,相当于把数组前面全部接到最后一个元素后面 -> 为了节约空间,循环不变,用i%len(nums)来代替。496.下一个更大元素 I。503.下一个更大元素II。
2025-01-14 22:23:31
234
原创 动态规划总结
子结构(状态转移公式),也就是什么情况下能用动态规划方法,如果一个问题本质上就是若干个比他规模更小的问题的延申,且该问题的最优解一定是子问题的最优解,那么这个问题可以用动态规划来解决。(不同状态转移的方法->不同的状态dp,如股票问题,或者不同的状态转移方法->同一个状态,但不同的方法,如字符串问题相等或者不等,背包问题加还是不加,小偷问题偷还是不偷)(还有无后效性,每个状态都是过去历史的一个完整总结,以前各阶段的状态无法直接影响它未来的决策。子问题和母问题之间如何联系->状态转移公式。
2025-01-13 17:40:31
290
原创 day45 第九章 动态规划part12
当s[i-1]==t[j-1], dp[i][j] = s,t都往前挪一位+t不变s往前挪一位,可以先打印dp数组,用手算一算,就能推出+验证状态转移公式了。当不等,就是s往前挪一位,t不变。583. 两个字符串的删除操作。添加一个:dp[i-1][j]删除一个:dp[i][j-1]替换:dp[i-1][j-1]注意最大还是最小,以及+1。115.不同的子序列。
2025-01-13 00:04:58
131
原创 day44 第九章 动态规划part11
dp[i][j]表示以i-1,j-1结尾的最长公共子序列的长度。dp[i]表示以i为结尾的最大子数组和。或者用dp表示最长公共子序列的长度来做。1143.最长公共子序列。1035.不相交的线。
2025-01-07 23:54:23
197
原创 day43 第九章 动态规划part10
dp含义:dp[i][j]表示以i-1,j-1为结尾的最长重复子数组的长度,最后结果要求所有数的最大值(子序列问题通用)dp[i]表示以nums[i]为结尾的最长连续递增子序列的长度,配合最后result=max(dp)动态规划的实质,状态转移,下一个状态只跟上一个状态有关,如果记录状态是重点,即dp数组的构造和含义。dp表示以nums[i]结尾的最长递增子序列的长度。674. 最长连续递增序列。718. 最长重复子数组。300.最长递增子序列。
2025-01-07 12:19:56
244
原创 day42 第九章 动态规划part09
pay half when buy & sell/pay when buy/pay wehn sell都可以。方案二:四种状态,持有,不持有(卖出,冷冻,冷冻后期保持卖出状态)方案一:买入时算两天前的dp,初始化时初始化好第一天和第二天。714.买卖股票的最佳时机含手续费。188.买卖股票的最佳时机IV。309.最佳买卖股票时机含冷冻期。
2025-01-05 23:39:48
233
原创 day39 第九章 动态规划part07
思路:二叉树遍历,深度优先,后序遍历,从下往上递归,直到根节点求得 偷与不偷根节点 两种选择分别的最大值。思路:圆圈分为1偷和1不偷两种情况,转化为直线问题;再考虑一下长度为0或1的特殊情况。动态规划,偷不偷这家与上一家/下一家之间有联系,偷/不偷两种选择,求最大值。这家偷还是不偷有两种情况,跟前一家偷没偷有关,求最大值。337.打家劫舍III。213.打家劫舍II。有最优子结构和无后效性。
2024-12-11 23:08:52
213
原创 背包问题总结篇!
以上是求纯完全背包(金额),如果求方法数,看排列还是组合,排列:先背包后物品;二维:先遍历背包还是先遍历物品都可以,背包从小到大。一维:先物品后背包或先背包后物品都行,背包从小到大。一维:先物品后背包,背包从大到小。
2024-12-04 22:34:09
147
原创 day38 第九章 动态规划part06
isisNoneorTrue==322. 零钱兑换279.完全平方数跟上一题一样139.单词拆分没搞懂跟背包问题有啥关系,感觉就是个动态规划问题。这几题看下来还是一维用的多。
2024-12-04 21:41:26
192
原创 day37 第九章 动态规划 part05
因为遍历时加入顺序不同算2遍,3=2+1第一行/1+2第二行,但不要按照二维来想(实际上,按二维解释,dp[i][j] = dp[i-1][j] + dp[all items][j-coins[i]])dp[i][j] = d[i-1][j] + dp[i][j-coins[i]] 目标和为j的种类是没有i的种类数+有i的种类数。for的物品和容量能交换, 都表示组合数,因为dp[i-1][j]不变,加入顺序不变。由dp[1]=1,dp[2]=2推出,没什么特别的意义。518. 零钱兑换 II。
2024-12-01 21:43:09
417
原创 day36 第九章 动态规划part04
的列举,把底数2变成1,替代方案是要逐个求每一个约束下的最值,即时间空间复杂度O(m*n), 再加上初始条件,即可以O(N*m*n)的复杂度求得最值。要求最后一块石头的min重量,转化为要求重量最接近的2堆石头的重量差,即限制上限为sum/2的石头堆的最大重量。一组数,放/不放,有约束,求最大价值/装不装得满/数目... 就是01背包。穷举法列举出每一个物品放/不放入背包的情况,复杂度是O(2**N)01背包,重要的是dp数组含义和状态转移方程。最后一块石头的重量,转化成2堆石头的重量差。
2024-11-15 23:51:12
234
原创 day35 第九章 动态规划part03
根本原因:因为二维中,dp[i][j]只跟dp[i-1][...]有关,所以把dp[i-1]复制到dp[i],计算更新,这样空间复杂度减一。容量不够i放时,dp[0][j]=0;够放时,dp[0][j]=value[0]第一层[0]*3,因为0是int,immutable,所以三个元素相互独立。i-1,j-weight[i] - > 从物品i=0, 容量j=0开始。dp[i][j]表示物品0-i,背包容量为j,背包所能容纳的。容量j=0,dp[i][0]=0。5.手算dp数组,并打印检验!
2024-11-14 19:57:20
277
原创 day32 第九章 动态规划part01
5.检验:打印dp程序的数组,看是否跟自己手算的一样。746. 使用最小花费爬楼梯。1.dp数组及其下标含义。509. 斐波那契数。
2024-11-06 23:55:42
167
原创 day21 第六章 二叉树part08
二叉树的增加/删除,用有返回值的函数更方便,要记得上一层有结点接住本层的返回值。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。
2024-10-06 18:34:30
246
原创 day20 第六章 二叉树part07
通过递归函数的返回值完成其父节点的赋值操作。二叉树本质是链表,插入删除要记前后节点。235. 二叉搜索树的最近公共祖先。450.删除二叉搜索树中的节点。701.二叉搜索树中的插入操作。
2024-10-03 22:53:01
310
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅