- 博客(41)
- 收藏
- 关注
原创 代码随想录算法训练营day46|动态规划part13
LeetCode 5. Longest Palindromic Substring(LeetCode 647. 同一題的思路改一下、加一點,就能通過LeetCode 5)
2024-08-20 06:49:26
187
原创 代码随想录算法训练营day44|动态规划part11
将dp定义为boolean类型,dp[i]直接表示s.substring(0, i)是否为t的子序列。修改遍历顺序后,可以利用滚动数组,对dp数组进行压缩。
2024-08-15 05:16:47
257
原创 代码随想录算法训练营day41|动态规划part08
动态规划:版本二(使用二維數組(和卡哥思路一致),下面還有使用一維滾動數組的更優化版本)动态规划:版本二(使用一維數組)
2024-08-14 05:06:16
180
原创 代码随想录算法训练营day32|动态规划part01
动态规划中每一个状态一定是由上一个状态推导出来的,,贪心没有状态推导,而是从局部直接选最优的。这题和第一题的斐波那契数是差不多的。
2024-08-06 03:21:03
195
原创 代码随想录算法训练营day29|贪心算法part03
情况二:rest[i] = gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。这题还是比较简单的,只需要监控5美元和10美元的情况就好了,然后在20元的时候优先使用10美元的情况。情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的。
2024-08-02 05:12:58
130
原创 代码随想录算法训练营day24|回溯算法part03
这一题和分割回文串类似,也是一个分割问题。第一题:93. Restore IP Address。第三题:90.Subsets II。第二题:78. Subsets。
2024-07-27 02:11:18
438
原创 代码随想录算法训练营day23|回溯算法part02
可能有的录友想,为什么 used[i - 1] == false 就是同一树层呢,因为同一树层,used[i - 1] == false 才能表示,当前取的 candidates[i] 是从 candidates[i - 1] 回溯而来的。第三题:131. Palindrome Partitioning。这题和第一题的区别是,有重复的数字,但是不能重复使用数字。第二题是:40. Combination Sum II。第一题是:39. Combination Sum。回溯+动态规划优化回文串判断。
2024-07-26 05:16:05
162
原创 代码随想录算法训练营day22|回溯算法part01
这块可能初学者还不太理解,后面的回溯算法解决的所有题目中,我都会强调这一点并画图举相应的例子,现在有一个印象就行。第三题是:17. Letter Combinations of a Phone Number。递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。第二题是: 216.Combination Sum III。,是的,我指的是所有回溯法的问题都可以抽象为树形结构!因为回溯法解决的都是在集合中递归查找子集,第一题是 77.Combinations。
2024-07-25 05:19:29
179
原创 代码随想录算法训练营day21| Binary Tree part08
第一题是 669.Trim a Binary Search Tree。递归: 左闭右开 [left,right)递归: 左闭右闭 [left,right]迭代: 左闭右闭 [left,right]
2024-07-24 07:03:08
172
原创 代码随想录算法训练营day20|Binary Tree part07
第一题是:235. Lowest Common Ancestor of a Binary Search Tree。
2024-07-24 06:42:05
117
原创 代码随想录算法训练营day18|BinaryTree part06
在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。至于用前中后序哪种遍历也不重要,因为就是要全遍历一遍,怎么个遍历法都行,层序遍历都没毛病!統一迭代法-中序遍历。3.取前面高频的元素。
2024-07-24 06:02:39
143
原创 代码随想录算法训练营day17 | binary tree part 05
这题感觉是需要用到前序遍历,先找到binary tree的根节点,然后再分配他的左右节点。2. 样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。第三题:700. Search in Binary Search Tree。第四题: 98. Validate Binary Search Trees。本题,其实就是在二叉搜索树中搜索一个节点。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。这题也是比较基础的,先用递归三部曲确定范围和参数。
2024-07-19 04:48:55
299
原创 代码随想录算法训练营day16|Binary Tree part04
这一题是要找到最下最左的node值,我看到这题的思路是要先找到最深的地方,然后再查node的值。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点。第五步:切割后序数组,切成后序左数组和后序右数组。第一步:如果数组大小为零的话,说明是空节点了。说到一层一层切割,就应该想到了递归。第二题是112. Path Sum。第六步:递归处理左区间和右区间。
2024-07-18 03:27:25
210
原创 代码随想录算法训练营day15| binary tree part03
对于完全二叉树来说,需要注意的是是否满节点,在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。今天的题目也算是昨天和前天的一些二叉树知识的巩固和应用,递归的部分看着还行,迭代的部分没有怎么看,准备留到第二次来写。然后解法上要先明确递归三部曲,第一步是看递归函数的参数和返回值,第二步是明确终止条件,第三步是明确单层递归的逻辑。如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。
2024-07-17 03:46:30
310
原创 代码随想录算法训练营day14 | binary tree part02
不难发现,想要翻转二叉树,只需要把他的左右节点,以及次节点进行反转就可以。这边的思路就是在遍历的时候进行反转。前序遍历更适合用于实时计算节点的深度,而后序遍历更适合用于计算节点的高度。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。今天把递归的都整明白了,迭代的方法有点绕,得好好想想。今天的题目也都还是对于之前讲的递归、迭代的遍历方式的一种引用体现。,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。对称二叉树主要需要遍历的是左右两棵树的元素,
2024-07-16 04:26:20
337
原创 代码随想录算法训练营day13|二叉树part1
然后接下来就是二叉树中的递归和迭代遍历。分别介绍前中后序遍历的部分。统一的迭代法很好用,但是需要思考的比较多,到时候得回来复习一下。今天学习了一下二叉树的各种种类,例如满二叉树和完全二叉树。剩下递归的和普通的迭代法只需要知道思路可以很快的写出来。还有存储方式,链式存储和顺序存储。迭代(stacks)
2024-07-15 02:27:44
194
原创 代码随想录算法训练营11|stacks & queue part2
这题初见的时候还是有点懵的,就感觉说这个想不到怎么解法,但是看了卡哥的动图引导就了解了一点,相当于1047那个消消乐一样,只不过是一个个存进stacks里,然后在有符号运算的时候计算数,然后再合并。学习到了大顶堆和小顶堆的概念,这题可以使用小顶堆来弹出小的数,然后留在堆中的就是题目需要的数了。还学了优先队列的部分,但是具体的还要再理解一下。主要的处理就是分辨加减乘除,然后根据stacks的特性巧妙的达成了题目的要求,同时也是计算机计算这些公式的标准做法,即为后缀表达式。附上参考的代码,以及简化版本。
2024-07-13 04:45:30
211
原创 代码随想录算法训练营day10 |stack&queue
这道题也比较简单,就是类似爱消除一样把同样的adjacent给消掉,输出没有连续相同的字符串。这题就是要检测左括号和右括号是否相同,且必须要有相同类型的左右一组,如果不符合就输出false。也是比较简单的题,主要考察对于stack的功能。今天的第一题是:232. Implement Queue using Stacks。今天的题目相对来说简单一些,有一些剩余的时间可以用来巩固之前学习的内容。stack有的功能:Push, Pop。这题也是差不多的,只不过是反过来。还有一种直接将字符串当作栈的办法。
2024-07-12 03:22:08
174
原创 代码随想录算法训练营day09|字符串part2
主要要做的就是根据给出的数字n,将末尾的n个字符插入到字符串的前面。给出的方法是把字符串分成length-n和n部分,然后让他们整体反转,然后再把length-n和n部分各自反转,就变成了想要的输出。题目需要在一串字符中,把每个单词都反转,我的思路是,以空格来分段,然后遍历每段的单词数量,然后将他们整体翻转。如果设限,不用split的话,我们可以用双指针的做法来做,然后反转的部分和之前字符串part1做的344. 541类似。第一题 151. Reverse Words in a String。
2024-07-11 06:10:45
229
原创 代码随想录算法训练营day08|字符串part1
这一题感觉初看有点复杂,限定了2k个字符的前k个反转,然后剩下的如果不够k个字符,反转剩下的全部,如果介于k与2k之间,则反转前k个字符,然后剩下的不变。然后用一个for循环来操作,剩下的部分不足2k的再分布讨论。用temp来做交换。第三题是来自卡玛网的,将字符串中的数字都转换成number,这一步同时也需要我们去扩充字符串的大小。题目需要做的是将字符串反转,比如hello转换成olleh,还是比较简单的,可以用双指针做出来。今天的题目还是在巩固双指针的部分,可以多思考一下从左右两端进行遍历的情况。
2024-07-11 04:43:59
279
原创 代码随想录算法训练营day07
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。这道题对于哈希解法来说不太合适,缺点是很费时间也很容易超时,去重也是一件很难的事情。
2024-07-10 07:30:25
283
原创 代码随想录算法训练营day6|哈希表part1
第二种就是要求tableSize大于dataSize的时候,哈希表可以将冲突的位置中放入一个数,然后向下找一个空位放置另外一个冲突的数。这题主要的难点是计算十位和个位的平方数。这题需要做的操作是建造一个hash map然后遍历数组去查询数组中的元素,然后输出数组元素对应的下标。,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。但是如果给入的数值大于哈希表的大小,就引入了一个新的概念叫做哈希碰撞。然后我还看到了别人写的快慢指针的解法,很好的思路,值得学习。但是这种方法泛用性不强。
2024-07-10 05:33:57
328
原创 代码随想录算法训练营day4|leetcode 24, 19,142
以及一种先行移动长链表实现同步移动的解法,比较基础,就是算出数组的长度,然后让cur A和curB在同一起点上。感觉递归方法会很方便,写起来也比较少,但是重要的是刚接触到的时候很不容易想出来递归的方式来做题目。感觉这题技巧性很高。有点没看明白,今天的几道题都是由于时间原因没有好好看,准备回头再复习一下。感觉和reverse有点像,也是先定位要改变的位置,然后指向下一个想要的顺序,然后再还原。第三题:Intersection of Two Linked List。是用的快慢指针的办法。
2024-07-09 08:03:43
160
原创 代码随想录算法训练营day3|203.Remove Linkedlist Elements 707.Design Linked List 206.Reverse LinkedList
先确定head是不是null以及head的值是否为题目需要的,然后再把当前的值 curr作为链表的头节点再往下遍历。链表里有单链表和双链表,双链表就是每个节点有两个指针域,一个指向上一个、一个指向下一个。解法: 要注意的点是区分单链表和双链表的处理方式不同,以及双列表中判断从哪一端来遍历更好。首先复习一下链表的一些基础知识,首先链表是由数据和指向下一个数据的指针组成。今天的还是有点难度,特别是递归的部分还需要再理解一下。今天的第一题是移除链表中的元素。还有首位相连的循环链表。链表可以做到动态删减。
2024-07-09 04:59:54
271
原创 代码随想录算法训练营第二天|977. Squares of a Sorted Array 209.Minimum Size Subarray Sum 59.Spiral Matrix II
在这里学到的一点就是,当计算这个数的平方时,可以使用l++和r--来对下一步要操作的数字进行进位,在res[j--] = nums[l] * nums[l++];中, 仍然是得到的是这个数字l的平方,然后l++的作用就是使用num[l]的当前值进行计算,然后将l增加1。因为数组里面如果有负数的话,平方过后得到的数字可能是比较大的,这种情况就很适合使用双指针来解题。很重要的一点:边界问题。待做事项:复习之前的题目,总结数组,附上看到的思维导图,很不错。其实还算比较简单的,重要的是每条边的处理规则需要统一。
2024-07-04 06:58:38
295
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人