- 博客(53)
- 收藏
- 关注
原创 【代码随想录day62】【C++复健】 97. 小明逛公园(Floyd 算法精讲);127. 骑士的攻击(A * 算法精讲)
首先起点和终点肯定要有,这就会占去两个维度,但他们之间的递推关系并不明朗,假设我要从i到j,有可能经过3个节点更短,也有可能直接连接更短,难道为了求i到j把所有从i出发的边全都遍历一遍吗?这样显然是不现实的。因此通过额外加入一个维度来实现递推关系,这个递推关系实际上就是一步步扩大中间节点的范围。为什么要有kk是为了逐步引入更多的中间节点,它在动态规划中起到了决定性作用,帮助我们通过考虑越来越多的中间节点来更新最短路径。k代表着路径中允许使用的中间节点集合。随着k。
2024-12-18 15:41:10
1255
原创 【代码随想录day60】【C++复健】 Bellman_ford 队列优化算法(又名SPFA);bellman_ford之判断负权回路;bellman_ford之单源有限最短路
仔细一想又感觉是理所当然的。而队列里的元素代表到这个元素的权值更新为了更小值,需要进行松弛操作,而假设我发现某个节点已经出现在队列中时,则说明其已经要在稍后进行松弛操作,因此没必要进行重复的添加操作。本题来说既然我是一个队列优化的算法,所以我需要知道当一个节点出队列的时候,有哪些节点需要插入队列,此时使用邻接表确实是一个很不错的方法。其次就是经典的,empty忘记加括号,该写que的地方写了个queue,读取顶端元素要用front而非top,自己写的时候总是遇到的问题。这点在定义类的时候也是一样的。
2024-12-17 19:36:54
352
原创 【代码随想录day59】【C++复健】 47. 参加科学大会(dijkstra(堆优化版)精讲 );94. 城市间货物运输 I
在定义上来说,这个优先队列里面存的是从源点出发到当前节点的距离,而并不是带权值的边,在定义上是不太对头的,但如果真的写成edge,然后里面存从源点出发到当前节点的距离,语法上也是不会报错的,并且也能得到正确答案,但可读性就很差了。for (Edge edge : grid[cur.first]) { // 遍历 cur指向的节点,cur指向的节点为 edge// cur指向的节点edge.to,这条边的权值为 edge.valif (!
2024-12-16 23:55:49
703
原创 【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)
但这样做的坏处在于,卡哥的这种写法会让循环继续执行,但假设我们循环一整圈都没有找到比INT_MAX更小的距离,此时其实说明已经没边了,所以循环没有必要继续执行了,直接break掉还能省点事情。比如,节点 1 在初始化时已经被插入队列了,但后面又因为错误的逻辑反复地被插入队列,这显然是不正确的。虽然的确是第一次写最短路算法,也是边看着解析边做的,但确实感觉这个题和prim算法非常的像,只要稍微改一下更新的公式就行,自信就来了。最终通过这样的调整,不仅解决了死循环问题,还让代码的逻辑更加清晰,执行效率也更高。
2024-12-12 16:00:39
677
原创 【代码随想录day57】【C++复健】 53. 寻宝(prim算法);53. 寻宝(kruskal算法)
问了下GPT说是都可以,那当然还是用邻接数组会更好实现一点。并且本题当中边还是很密集的。一维即可,长度为v+1,因为0号位我们会进行弃用。
2024-12-11 20:03:08
483
原创 【代码随想录day56】【C++复健】 108. 冗余连接;109. 冗余连接II
在无向图当中这是完全没问题的,这是因为你不知道插入的节点之间的父子关系是什么,有可能是插入一个父亲,也有可能是插入一个儿子,因此没办法去判断入度和出度的问题,但是在有向图中这个情况就有问题了,它会让3的入度为2,从而违反树的定义。举个例子,假设1->2->3,那么我们再插入一个1->3就会导致3的入度为2,再插入一个3->1虽然入度出度都符合要求,但此时成环了。:在无向图中,并不涉及节点的入度和出度的概念,因为无向图没有方向。其实无向的图当中“树”的概念非常淡薄,因为你没法区分谁是谁的父亲,谁是谁的儿子。
2024-12-10 23:00:01
443
原创 【代码随想录day55】【C++复健】 107. 寻找存在的路径
没什么太好说的,套用卡哥写的模板即可,唯一要注意的就是这个数字是从1开始到n,所以father数组得设置成n+1的长度,不然会发生越界错误。除此之外就是记并查集模板了。啊,还有就是我这里因为不知道n多长一开始没有给father赋值,但按照卡哥的意思可以一开始就根据M和N的大小定义一个够用的即可。那么就定义101即可。当然我感觉像我这样一开始不定义,后面等n输入了再去定义也是可行的。
2024-12-10 00:58:38
244
原创 【代码随想录day53】【C++复健】 110. 字符串接龙;105. 有向图的完全可达性;106. 岛屿的周长
本题确实看了之后有一点思路,想到了算距离,也想对了第一步都是与beginStr的距离为1的元素,因此我想着加一个每个元素到beginStr的距离来判断第几次for循环中,能访问到哪些单词,但是这个想法有诸多问题,比如说单词A与beginStr的距离是2,那我还需要分析存不存在一个距离为1的单词B能够下一步转换成单词A,此时就变成了计算单词B与单词A的距离,那与beginStr的距离是2的条件也就没用了。本题复杂度上面比前面简单了不少,不过因为没写过类似的代码,导致没有什么思路,所以去看了解析的做法。
2024-12-09 20:38:14
822
原创 【代码随想录day51】【C++复健】 101. 孤岛的总面积;102. 沉没孤岛; 103. 水流问题; 104. 建造最大岛屿
此外,我还思考了下遍历边界的dfs和遍历中心的dfs是不是也需要不一样,但事实上用同一个就行了,不光消灭陆地,还要消灭孤岛,反正能统计出来数就完事了,我统计弹匣里发射出去的子弹数也不是相当于统计人数了。然后就去偷看了一下解析,发现卡哥做法就很单纯直接,虽然我找不到浮岛,但我可以把其他地方都换一个值,换完之后我再回来搞,你是2就换回1,你是1就置0,很简单直接的想法。当然我写的代码还是很麻烦的,不过毕竟图论是完全的一周目,能写出来就算万事大吉了,也不奢求什么代码行数上的提升了。
2024-12-07 01:23:24
783
原创 【代码随想录day51】【C++复健】 99. 岛屿数量dfs;99. 岛屿数量bfs; 100. 岛屿的最大面积
首先尝试自己想,发现自己没什么思路,毕竟这里面的东西和细节都很多,比如这个int dir[4][2]的方向数组,虽然大概也看到了要设置这么个东西,但我写了个vector,甚至已经忘了还可以设置int数组这么东西。然后就是我没有体会到为什么要用dfs,我当时想的是,挨个去遍历每个陆地,然后有陆地的情况下,就使用一个专门的函数去判断其上下左右有没有其他陆地,有的话就把visited标成1。那如果是int数组的话,作为函数的传入值应该是什么(虽然解析里面用的是全局变量)?,如果它是岛屿的一部分(即。
2024-12-06 00:08:40
1091
原创 【代码随想录day50】【C++复健】卡码网98. 所有可达路径
i++) {确实比我底下代码里的写法稍显简单。cin >> n;cin >> m;i<m;i++){j<len;j++){else{除此之外,又看了一下邻接表的做法,确实是我不看解析很难写出来的。主要有几个估计会难想的地方,底下列举一下。
2024-12-04 22:38:34
279
原创 【代码随想录day49】【C++复健】 42. 接雨水;84.柱状图中最大的矩形
42. 接雨水单调栈解法:遇到了若干问题,首先就是思路只对了一半,光想着右半边更大怎么处理,以为左半边只要用int记录一个最大值即可,但实际上应该是和栈里面当前元素左边的元素高度进行比较并且取最小值。除此之外,哪怕想到了正确的逻辑,但由于代码里有一个出栈操作,哪怕在一开始判断过栈非空,还有可能在出栈之后栈为空,从而导致报错。
2024-12-03 20:13:17
471
原创 【代码随想录day48】【C++复健】739. 每日温度;496.下一个更大元素 I;503.下一个更大元素II
739. 每日温度一顿操作猛如虎,一看击败5%。一眼顶针,鉴定为在存栈的时候把值和下标一起存了,所以导致了问题。果然如此,改完之后就对了,击败93.07%。496.下一个更大元素 I虽然卡哥说只是加了一点难度,但实际上变量一变多,我的脑子立刻就不够用了,接连犯错。每一层下标取完,出来对应什么含义,脑子一下就不清醒了。做完之后看了下解析,我的做法和卡哥的做法还不太一样,具体区别体现在哈希表的建立方法上。我的代码:1 哈希map怎么插入值忘了。
2024-12-02 20:17:53
841
原创 【代码随想录day46】【C++复健】647. 回文子串;516.最长回文子序列
647. 回文子串这道题确实比较有挑战性,特别是当尝试理解如何利用动态规划(DP)数组之间的关系时,感觉难以把握。我最初的思路是从每个字符出发,尝试往左和往右扩展,直到不能扩展为回文为止。:如果我们从当前位置i开始,下一步扩展就会变成比较i+1和i-1,这样就能找到奇数长度的回文子串。然而,偶数长度的回文子串则无法通过这种方式统计出来。为了涵盖偶数长度的回文子串,我需要为每一对相邻字符单独处理,这样就需要额外写一个循环来处理,增加了不少复杂性。:这种方法更像是对回溯的优化。
2024-12-01 23:01:56
929
原创 【代码随想录day45】【C++复健】115. 不同的子序列;583. 两个字符串的删除操作;392. 判断子序列
(undefined behavior),也就是说,如果发生溢出,程序可能会崩溃,或者产生错误的结果,或者程序的执行会继续并且结果是不可预测的。
2024-12-01 17:16:02
921
原创 【代码随想录day44】【C++复健】1143.最长公共子序列;1035.不相交的线;53. 最大子序和;392. 判断子序列
1143.最长公共子序列本题一开始以为是和前面那个一维递增子序列一样,dp数组的[i][j]表示的是以i,j为结尾的最长公共子序列,然后用两个for循环去前面找前缀对应的最大值,这样写出来的代码算上遍历总共要4次for循环,结果当然是会超时,并且我的代码还不知道哪里有问题,得不到正确的结果。那么为什么本题用的是卡哥那样的定义方法,即:1 如果当前位置相同,就是i-1,j-1位置的值+12 否则,取i-1,j和i,j-1的最大值。
2024-11-29 22:58:26
455
原创 【代码随想录day43】【C++复健】300.最长递增子序列;674. 最长连续递增序列; 718. 最长重复子数组
此外,这里的i<=m和j<=n第一遍也没写出来,当然也有可能是我半道修改的,没想起来。2 一开始result定义写的是0,但这会导致比如在[2,2,2,2,2]这样的数组中,一次都没执行循环的情况下,返回0,但正确的值应该是1才对。1 i=0和j=0的情况都要单独列出来,单独进行处理,并且此时也要更新最大值,因为最大值是有可能出在这里的。1 在比较的时候把if(nums[i] > nums[i-1])写成了if(dp[i] >dp[i-1])没使用i-1和j-1进行比较,导致算不出正确答案来,总是小1个。
2024-11-27 22:04:50
311
原创 【代码随想录day42】【C++复健】188.买卖股票的最佳时机IV;309. 买卖股票的最佳时机含冷冻期;714.买卖股票的最佳时机含手续费
原因是,在计算卖出次数时,这个代码当中其实考虑了当天同买同卖的情况。如果实际交易次数是i,而没有完全使用k次交易,实际上与发生了k-i次同买同卖的结果是一样的。所以,并不需要比较。只要我们直接取dp[n-1]中的最后一个值,就能得到正确的结果。
2024-11-27 17:27:05
487
原创 【代码随想录day41】【C++复健】121. 买卖股票的最佳时机;122.买卖股票的最佳时机II ;123. 买卖股票的最佳时机 III
要问我这几天人去哪了~ 自然是——炒股去了!事实证明,会写股票问题的代码和会炒股完全是两码子事,还是安心当码农吧。
2024-11-27 12:59:06
223
原创 【代码随想录day39】【C++复健】198.打家劫舍;213.打家劫舍II ;337.打家劫舍III
198.打家劫舍本题别的地方都写出来了,不过在最后写的时候我没想明白dp[n-2]有没有可能比dp[n-1]大,写了个max(dp[n-1],dp[n-2])。但其实这个问题很简单,因为在dp数组里面dp[i]里取max的时候有一项就是dp[i-1],所以一定是大于等于的。213.打家劫舍II本题老毛病又犯了,这两个dp数组可以用一个函数进行复用,然后只要输入不同的下标即可,但是我却自己实现了这两个dp数组,在传值和合法性判断上,写起来麻烦不少,不过好在能正常执行。
2024-11-24 18:16:39
963
原创 【代码随想录day37】【C++复健】完全背包;518. 零钱兑换 II ;377. 组合总和 Ⅳ;卡码网:57. 爬楼梯
完全背包能知道就是单纯换一个遍历顺序,不过思考了一下循环的顺序能不能替换,后来卡哥给了我答案:是可以的,因为状态转移方程上面对应位置的值只要被正确更新,两种循环就都是可以的。518. 零钱兑换 II一遍写了个大概齐,但是发现溢出了。然后把int换成long long还是溢出,最后换成unsigned long long才正常... 这个说实话感觉有点单纯为了恶心人了。
2024-11-22 00:09:02
254
原创 【代码随想录day36】【C++复健】1049. 最后一块石头的重量 II ; 494. 目标和 ;474.一和零
纠结了一下是要定义bagsize为sum/2还是sum/2+1,但在最后return的时候发现,如果设置成sum/2+1的话,没办法保证2*dp[bagsize]和sum之间哪个更大,所以选择了向下取整。i++){j--){
2024-11-21 01:33:52
403
原创 【代码随想录day35】【C++复健】01背包问题 二维;01背包问题 一维;416. 分割等和子集
01背包问题 二维上来就是默写了一个一维的,二维的怎么写都忘了,一维的为什么这么写也忘了,但就是能做出来,这就是dp。偷看了解析之后也是回想起了二维dp的大致思路,但仍然在细节方面遇到了各种问题:1 二维数组的第二个维度要设置成n+1而并非n,因为0号位代表的是背包容量为0时的情况,所以下标n,长度n+1的地方,才是代表背包容量为n的情况。但这样的写法会产生错误的结果,因为一维滚动数组不进行更新实际上是因为里面的值在上一轮就已经存好了,并不需要再进行更新了。
2024-11-21 00:19:30
373
原创 【代码随想录day34】【C++复健】62.不同路径;63. 不同路径 II;343. 整数拆分;96.不同的二叉搜索树
感觉dp的题真的很适合背,当然不是死记硬背,而是当做一种模板题,出来一道新的题就往模板题上面去靠,如果套对模板的话剩下的事情其实就简单了。所以只要看一遍解法知道大致思路其实就够了,毕竟大部分dp的代码也不算难写。
2024-11-18 21:35:53
961
原创 【代码随想录day32】【C++复健】509. 斐波那契数;70. 爬楼梯;746. 使用最小花费爬楼梯
今天的内容相对比较基础,作为一个二周目的人做这些题相对还是容易的。509. 斐波那契数虽然也是一遍写出来,但这样的定义方法假如是从后往前遍历就不行了。所以最好还是按照解析里的写法,写成vector<int> dp(N + 1);的样子比较好。
2024-11-16 20:42:06
270
原创 【代码随想录day31】【C++复健】56. 合并区间;738.单调递增的数字
我直接用int写,多写了很多才达到相同效果,包括获取每一位的代码,以及最后转回int的代码,都要比str费事。2 每次发现一个位置不行的时候,不需要立刻在原处就执行一遍9的替换和当前位置-1,因为前面的位置上还有可能出状况,现在做了替换很有可能是白干。实际上的规则应该是:从哪一位开始违反递增规则,就把其后面的数全都置为9,并且将当前位置元素值-1,然后当前位置元素值发生变化有可能会影响与前面元素的大小关系。由于本题是合并区间,判断是否连续显然是用下一个的左区间与前一个的右区间比较,属于没想清楚了。
2024-11-15 18:47:55
489
原创 【代码随想录day29】【C++复健】134. 加油站;135. 分发糖果;860.柠檬水找零;406. 根据身高重建队列
感觉贪心的题真的很考验一个人的智商,而我,碰巧没有。134. 加油站偷看了解析思路,但依然因为一个低级失误导致被卡了很久... 并且写出来的代码也非常的麻烦,主要体现在我每到一个新节点,就必须求证似的让iter走完一整圈才算结束,但卡哥的方法一个for循环就结束了。卡哥的思路也相当的清晰:简单来说就是当你一圈下来:1 如果和小于0,那么说明无论如何无解,也不用往后再看了。
2024-11-14 01:08:12
736
原创 【代码随想录day28】【C++复健】122.买卖股票的最佳时机II ;376. 摆动序列;53. 最大子序和
122.买卖股票的最佳时机II一周目做dp的时候也遇到过这个题,也知道这个题怎么不用递归做。这种题其实在知道怎么做了以后就会变得很简单,所以做出来也是洒洒水啦。55. 跳跃游戏也是一遍做出来了,不过做完之后看解析,写法和卡哥不太一样,卡哥是直接看最大下表覆盖能到哪里,我的这个写法相当于是一个汽车从nums的头开到尾,每个地方都有加油站,那每个nums[i]代表在这里加完油以后,最多能开再开几个地方。那我这种想法我觉得还是比较形象的,必过相比卡哥的做法很显然还是麻烦了一点。
2024-11-13 01:59:58
818
原创 【代码随想录day27】【C++复健】455.分发饼干 ;376. 摆动序列;53. 最大子序和
455.分发饼干看了解析之后倒也能理解循环换过来之后就能简单很多,或者按照我这个循环顺序但是从小的饼干开始也可以很简单就写出来,可是冥思苦想半天也没搞明白为什么。苦思了2年半之后才终于有了一点想法:1 从胃口大的小孩开始,假设这个小孩没有饼干满足,那么就没有能满足他的饼干了。此时我们可以放心大胆的跳过这个小孩,他已经可以remake了。
2024-11-11 23:47:11
276
原创 【代码随想录day25】【C++复健】491.递增子序列;46.全排列;47.全排列 II;51. N皇后;37. 解数独
在同一层循环内,两个相同的数被选择所形成的结果是相同的,尽管它们可能出现在不同的位置,但生成的子序列完全一致。这个题倒是学会分治了,把递增的判断专门写了一个函数,但其实每次只要和vector的尾部判断就行了,完全不需要写一个函数,属于是ptsd了,然后就没去细想,另外也可以说是没想明白递归就可以完美解决递增判断的问题。因为对于我来说,这个题我没有见过,所以它不是经典题,而是一个全新的,并且很难的题,这样的题,或者哪怕是一个很简单很简单的题,只要我没做过,这个也是对二维数组不熟悉导致的,还需要多练多熟悉。
2024-11-11 01:55:31
730
原创 【代码随想录day24】【C++复健】93.复原IP地址; 78.子集 ;90.子集II
今天写代码的时候整体状态其实就不太好,整个人晕晕的,好多时候写出来的代码也是多少带点愚蠢。93.复原IP地址看卡哥说“大家做完 分割回文串 之后,本题就容易很多了”还以为是秒杀题呢,结果直接被卡住。怎么说呢,做完了分割回文串对这道题来说也只能大致想明白一个思路,但是具体实现上细节其实真的还蛮多的。
2024-11-09 01:50:13
1001
原创 【代码随想录day23】【C++复健】39. 组合总和;40.组合总和II; 131.分割回文串
39. 组合总和本题一开始做的时候没想明白要不要先进行一下排序,没排序的代码试着提交了一下就直接过了。仔细想了一下首先这道题的元素可以无限取,其次每个元素只会出现一次,也就是说不会出现重复。而排序的目的实际是为了去重,所以本题不需要进行排序。40.组合总和II本题来说还是遇到了较多的问题的,一一列举记录一下:1 c++的sort方法不会用,写成了sort(candidates);,但实际上正确的写法是sort(candidates.begin(), candidates.end());
2024-11-07 22:14:36
578
原创 【代码随想录day22】【C++复健】77. 组合;216.组合总和III; 17.电话号码的字母组合
77. 组合这题做完之后还是有一种稀里糊涂的感觉。思考了半天什么范围合理,并且怎么设置才能让这个范围合理,然而一看答案,发现答案完全没考虑这些因素,直接暴力全遍历了。只能说确实这样能够放弃思考,比较省心一些...
2024-11-06 19:09:18
316
原创 【代码随想录day21】【C++复健】669. 修剪二叉搜索树;108.将有序数组转换为二叉搜索树 ;538.把二叉搜索树转换为累加树
本题也一遍秒了,稍微转换一下思维让中序从先遍历左子树变成先遍历右子树即可。和解析对比了一下,思路和代码也都差不多,没什么好说的。经过两年半的刻苦二叉树修炼,终于能一遍秒了。108.将有序数组转换为二叉搜索树。538.把二叉搜索树转换为累加树。669. 修剪二叉搜索树。今天的卡哥真温柔啊。
2024-11-05 16:40:08
244
原创 【代码随想录day20】【C++复健】235. 二叉搜索树的最近公共祖先;701.二叉搜索树中的插入操作 ;450.删除二叉搜索树中的节点
卡哥的操作是无论如何先递归一步,递归完了你这个节点要是空,我就直接新建要插入的节点,然后把指针返回,不为空,我就继续进行递归操作。可以算是半步秒杀吧。看了下卡哥的写法,还是比我更高明一点,不仅把一开始根节点为null的情况也包含了进去,还剩了一个if else的判断,只要写一个是否为空的判断即可。做完后也是又看了一眼原理解析,卡哥说的很对,找到这个在范围内的节点后,再往左或者往右都一定会错过其中一边,那就不是公共祖先了。简单来说,就是我先判断它的左右节点是否为空,如果为空就直接插入,不为空就继续递归。
2024-11-05 00:05:51
244
原创 【代码随想录day18】【C++复健】530.二叉搜索树的最小绝对差 ;501.二叉搜索树中的众数 ;236. 二叉树的最近公共祖先
咳咳,小鸽两天出去玩一下,其实昨晚想更新的,但每道题都遇到了若干不好解决的问题,直接把我给绊住了,所以拖到今天更新啦。
2024-11-04 22:07:45
1033
原创 【代码随想录day17】【C++复健】654.最大二叉树; 617.合并二叉树 ;700.二叉搜索树中的搜索;98.验证二叉搜索树
654.最大二叉树这个题其实和昨天最后一题是比较像的,当时没用下标来做,那么本题就用下标做一下看看思路上有没有什么问题。从结果上来说可以说是大部分内容都一遍写对了,但是对于.begin()和.end()到底返回的是迭代器还是下标又忘记了,所以第一遍传入参数写的不是tree(nums, 0, nums.size());,而是tree(nums, nums.begin(), nums.end());,导致了报错。617.合并二叉树这个题其实属于典型的初见杀题目,一看到两个二叉树就会不知所措。
2024-11-01 17:48:26
469
原创 【代码随想录day16】【C++复健】 513.找树左下角的值;112. 路径总和;113. 路径总和II; 106.从中序与后序遍历序列构造二叉树
513. 找树左下角的值。
2024-11-01 01:30:19
1007
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人