自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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

原创 day53 第十一章:图论part04

105.有向图的完全可达性。bfs: 求最短路径长度。

2025-02-17 00:58:38 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

原创 day51 第十一章:图论part02

每一块的上下左右都遍历过了之后,这块陆地就遍历完了。广搜用队列(deque),100. 岛屿的最大面积。

2025-02-13 12:29:21 503

原创 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

原创 day46 第九章 动态规划part13

516.最长回文子序列。

2025-01-13 16:48:05 107

原创 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

原创 day41 第九章 动态规划part08

123.买卖股票的最佳时机III。122.买卖股票的最佳时机II。121. 买卖股票的最佳时机。

2025-01-03 15:45:13 214

原创 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

原创 day34 第九章 动态规划part02

63. 不同路径 II。考虑障碍物对初始化的影响。

2024-11-08 20:41:40 265

原创 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关注的人

提示
确定要删除当前文章?
取消 删除