- 博客(21)
- 收藏
- 关注
原创 代码随想录算法训练营第 三十五天 |435. 无重叠区间、763.划分字母区间( cpp)
求最少删除多少个区间,使区间无重叠,就是同届重叠个数,然后 总数 - 重叠区间 ,这样就能得到结果了。对于right不管是什么条件都是要更新的,换句话说就是要时时刻刻更新,所以就直接跟新了。这个for循环是统计最后出现的位置,直接用i给hash数组赋值就行,不用求max。而且right是要和i比较,而不是和hash[s[i] - 'a']比较。该题目的解法有点神奇,如图。
2024-03-07 16:10:38
259
原创 代码随想录算法训练营第 三十四天 |406.根据身高重建队列、452. 用最少数量的箭引爆气球( cpp)
我对这个题目想了想,然后就凭直觉+估计完成了,但是,还是对这个题目不太能理解。首先排除没有气球的情况,我们是必须需要一支箭的。读完卡哥的题解我才对有些东西恍然大悟。从后一个气球考虑前一个气球的情况。
2024-03-05 19:04:52
252
原创 代码随想录算法训练营第 三十三天 |134. 加油站( cpp)
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。如果从前向后遍历,rating[5]与rating[4]的比较 就不能用上 rating[5]与rating[6]的比较结果了。因为 rating[5]与rating[4]的比较 要利用上 rating[5]与rating[6]的比较结果。先直接说,这题挺难,想不出,直接就看卡哥的题解。
2024-03-03 14:52:58
292
1
原创 代码随想录算法训练营第 三十二天 | 122.买卖股票的最佳时机 II( cpp)
于是看了卡哥的题解,看到了这张图一切就明白了。只收集每天的正利润!自己想得迷迷糊糊的写出代码,但是一提交发现过了。
2024-03-02 15:31:36
228
1
原创 代码随想录算法训练营第 三十一天 | 455.分发饼干、376. 摆动序列、53. 最大子序和( cpp)
贪心想不出,直接说思路吧,当前“连续和”为负数时就立即放弃,从下一个元素重新计算“连续和”,有人疑问:但是如果后面都是很多整数,不就将前面的负数“连续和”加回来了吗,但是要想,如果将“连续和”重置为0再从后面相加肯定是比负连续和加前面的正数要大一些。对于这个题目,我也是想到了贪心算法,但是代码是两层for循环,所以运行的效率有点低……,然后看了卡哥的题解,发现代码写得还是很润的,这点,值得多多学习。但是,该题目的贪心要配合着代码的相关细节才能写出,而且代码的相关细节比贪心的思路更不容易想出。
2024-03-02 11:39:01
191
原创 代码随想录算法训练营第 三十天 | 332.重新安排行程、51N皇后( cpp)
对于isValid函数,没有对行的处理,因为在单层搜索的过程中,每一层递归,只会选for循环(也就是同一行)里的一个元素,所以不用去重了。自己是尝试做了做,但是代码写得又臭又烂,而且还过不了,所以,就直接看卡哥的题解了。对于某些回溯题目中对应的添加元素有作要求时,可以在for循环中添加if语句。这样写代码能达到期望的要求。
2024-02-29 21:35:59
345
1
原创 代码随想录算法训练营第 二十九天 | 491.递增子序列( cpp)
然后走流程,画对应的树状图,一个重要的信息就是每层用过的元素就千万不能再用了,要不然就可能出现重复的结果,这也就是树层去重。那么如何写这个相关的代码了,可以用哈希表,但是根据该题目的特殊性,输入的元素较少,可以使用静态数组来记录。首先要明确什么是子序列,对于该题目所要的结果是千万不能排序的,如果排序了,那么结果也就不正确了!还有一个重要的点,就是当记录有负数的元素时如何处理(代码中已经讲的很清楚哦)。
2024-02-28 21:54:01
152
原创 代码随想录算法训练营第 二十六天 | 40.组合总和II、131.分割回文串( cpp)
如何去重树层,该题目的解法就是先排序,然后相同的元素只用第一个就OK,后面的相同元素再用的话就可能会出现重复。,就以该题目来说,所给出的集合有大小相同的元素,如果树枝不去重,那么就会在结果集path中有相等的元素;如果树层不去重,那么就可能在result中出现相同的元素。所以对于树层,是一定要去重的!在卡哥的视频讲解中,他引进了两个重要的概念,因为我们都将回溯算法抽象成一个树了,然后对于回溯重要的是去重,那么就有。回溯算法要先进行大致的相关操作,至于得到题目需要的结果集,再在后面想办法收集。
2024-02-27 20:13:38
185
原创 代码随想录算法训练营第 二十三天 | 17.电话号码的字母组合( cpp)
这是当时没有一点头绪,然后大致地看了卡哥的题解之后才写出来的,当时觉得很巧妙的一点就是是用来string类型的数组来解决了该问题。这一点也是很巧妙的,掌握了该两点,还有一个点,就是在我写回溯函数的时候,要穿参数,但是我直接写又不知道写那些参数,要想一些才知,(参考代码随想录网站)
2024-02-26 20:44:47
142
1
原创 代码随想录算法训练营第 二十天 |530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先 (cpp)
对于maxCount是用来记录最大的count数值的,如果count和maxCount相等,那么简单,就将当前元素放入数组就OK了;但是如果count大于maxCount的话,那么那么result数组就要clear,然后maxCount就等于count,再将当前的元素记录到result数组中。因为该二叉树是平衡二叉树,可以使用中序遍历,和pre指针, 当pre为空时count就为1, 每次向后遍历,当当前元素和pre的元素相等时,那么count就自增一位;该二叉树对应的结果就是5,根据我们的代码,
2024-02-18 14:27:51
504
原创 代码随想录算法训练营第 十九天 |98.验证二叉搜索树(cpp)
2、该题目要使用中序遍历从左到右遍历二叉树,通过记录是否是递增的,如果是,那么就直接是平衡二叉树了,但是一旦发现不是递增的就直接返回 false 就行了。样例中最小节点 可能是 int 的最小值,如果这样使用最小的int来比较也是不行的。此时可以初始化比较元素为 longlong 的最小值。这样的代码,然后就直接错了。
2024-02-17 19:59:57
1096
1
原创 代码随想录算法训练营第 十七天 |110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和(cpp)
一开始,我认为就是只要将根节点的左子树的高度和右子树的高度求出来,然后这两个高度的差值,如果是大于1那么就要返回-1,但是这样的话就忽略了左子树/右子树是否为平衡二叉树的情况。然后就看了卡哥的解析,然后可以构造一个求树高度的函数,值得注意的是,要用。最后还要掌握 int 转换 string 的 atoi 函数。只要遇到左右子树之差大于1的情况,那么就直接返回-1。通过父节点来收集子节点的结点值。* 该题目使用了回溯。注意非常重要的一点,
2024-02-14 20:29:47
155
1
原创 代码随想录算法训练营第 十三天 | 239. 滑动窗口最大值(cpp)
2、该题目要用滑动窗口遍历数组将数组中在滑动窗口中的最大值找出来。就是要使用以deque为基础的队列。1、首先该题目不简单,看卡哥的题解之后,发现还要自己创造一个队列(实在是想不到)。
2024-02-05 19:56:45
151
1
原创 代码随想录算法训练营第八天 | 541. 反转字符串II、54. 替换数字(第八期模拟笔试)、 151.翻转字符串里的单词(cpp)
2、消除空格,就像当时的消除数组中的元组一样,定义两个指针进行操作,对于该题一定要记住一点,我们只对非空格操作,对于每一个单词都要在前面加一个空格(第一个单词除外)。那么如何对第一个单词进行操作,那么就是当 slow 为 0 时也就是第一个单词的时候。2、在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。3、翻转字符串,先翻转整体的字符串,然后在逐个翻转单个单词。1、卡哥的解法很有牛,让我长知识了。
2024-02-01 16:24:19
1145
1
原创 代码随想录算法训练营第七天 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、 18. 四数之和 (cpp)
1、整体思路就是先排序,然后使用三个指针,第一个指针用for循环遍历,第二个指针和第三个指针放在第一个指针后面所有元组的首段和末端,然后再通过while(left
2024-01-31 19:06:10
148
原创 代码随想录算法训练营第六天 | 242.有效的字母异位词 、 349. 两个数组的交集 、202. 快乐数 、 1. 两数之和 (cpp)
题目难度不大,自己写了一遍,看了卡子哥的题目解答,然后发现这题是用来熟悉unordered_set的使用的。1、因为题目的描述,所以,可以用一个26个元素的数组来实现该题目(也就是哈希表的思想),从而解答该题目。看了代码,发现vector和set能够相互转化,然后的话,也熟悉了set和vector的遍历方式。所以,所求出的和可能有重复的,所以用unordered_set这个容器来判别重复项。2、该题目使用auto关键字,之前没学过,现在还是又长知识了。2、为什么要用哈希表?
2024-01-29 22:19:37
220
原创 代码随想录算法训练营第四天 | 24.两两交换链表中的节点、 19.删除链表的倒数第N个节点 、07. 链表相交 、 142.环形链表II (cpp)
该题目同样运用快慢指针的方法,先找出较长的链表,然后先让长链表的指针先跑一个差值,再让长链表的指针和断链表的从起始位置的指针同时跑,同时每跑一次比较两个结点是否一样,一样就返回该值;1、该题目运用双指针的快慢指针的方法,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。2.如何找到入口,定义两个指针,一个从链表的头结点出发,一个从快慢指针的相遇节点出发,让两个指针同时出发,两指针相遇的结点就是环的入口。
2024-01-27 22:35:20
266
原创 代码随想录算法训练营第一天 | 704. 二分查找
而且使用 right = mid -1,因为对于左左闭右闭情况,如果 right=mid,而nums[mid]一定是不在target的寻找范围之内的,所以 right=mid 不行,要用 right = mid -1。每次将部分数组前移后一定要进行 i--,因为i后面的数都向前移动了一位,所以i也向前移动一位,譬如[2, 2],移除的元素为2,如果不进行i--,那么返回的值就为1,所以要进行i--。同理,对于左闭右开,就要使用 left < right 和 right =mid了。
2024-01-24 20:49:29
392
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人