- 博客(20)
- 收藏
- 关注
原创 代码随想录算法训练营第39天||62.不同路径 、 63. 不同路径 II
由于只给了障碍物的位置,则先需要从障碍物的位置推出dp数组的大小,然后初始化第一行和第一列为1,但是此时要注意如果障碍物在第一行或者第一列的话,需要将障碍物后面或者下面都为0,因为这时障碍物之后的路走不通,状态转移方程与62题一致,只不过当推到障碍物的位置时不需要进行状态转移即可。忽略了障碍物在起始点的情况,初始化的步骤写起来有点生疏,但都是基础语法。构建二维dp数组有点生疏。
2023-04-22 16:03:32
346
原创 代码随想录算法训练营第38天||509. 斐波那契数、70. 爬楼梯 、746. 使用最小花费爬楼梯
需要想到到下一层台阶的花费是前一层台阶前的最小花费和前两层台阶前的最小花费的最小值,这样也就对应推出了状态转移方程,进而写完五部曲就能理清思路了。其实能想到追溯到前两阶台阶来推导最后一阶台阶的话,就可以推出最后一阶台阶的种类情况了,再按照五部曲走完就能写出代码。经典的菲波那切数列题目,按照Carl说的五部曲理清楚,思路就很清晰了。基础语法操作,跟着五部曲的思路就能写出。五部曲理清楚之后,代码都是基础语法。没什么问题,都是基础语法。
2023-04-21 20:33:01
119
原创 代码随想录算法训练营第36天||435. 无重叠区间 、763.划分字母区间、56. 合并区间
按左边或者右边排序都可以,按左边排序的话,就需要根据右边界来判断重叠区间,将两个有重叠部分的区间的最小部分与下一个区间的左边进行判断,如果有重叠,那就说明三个均为重叠区间,直至下一个区间与前面的区间没有重叠为止,这时以该区间为起始区间,再进行重叠区间判断,最后将所有区间数-非重叠区间数,即为需要移除的区间数量。一道经典的重叠区间题目,只不过多了一步合并的操作,判断该区间的左边界与前一区间的右边界是否重叠,重叠则将二者进行合并即可,在一开始依旧需要排序操作,左边右边都可以。
2023-04-19 19:57:51
96
原创 代码随想录算法训练营第35天||860.柠檬水找零 、406.根据身高重建队列 、452. 用最少数量的箭引爆气球
这跟之前的分发糖果类似,需要先处理一边后再处理另一边,先按照身高从高到低排序,这样的话处理另一边时就可以直接按照数值直接对应位置插入即可。今天学习了经典的贪心算法中的处理一边再处理另一边、重叠区间的用法,贪心算法确实没有明显的规律可循,没有基本套路,今日学习1.5h!这道题情况少,可以依次单独判断,在第三种情况下可以使用贪心算法,局部最优是优先用10的找零,这样可以拥有更多的5来方便后面的找零。运用了重叠区间的用法,是这道题的关键点,处理好重叠区间后就能实现局部最优。452. 用最少数量的箭引爆气球。
2023-04-18 11:30:02
99
原创 代码随想录算法训练营第29天||491.递增子序列、46.全排列、47.全排列 II
跟之前的子集问题有点类似,但是又有明显区别,不能对原数组进行排序,而且去重逻辑也不太一样,需要在每一层记录一下数组内的元素有无重复使用,并且子集的长度≥2才行,其他地方跟求子集的地方都比较相似的。这是包含重复元素的排列问题,那就要在去重数组进行进一步的判断,跟之前的包含重复元素的子集问题操作一样,排列问题和子集问题大同小异,注意几个细节的问题就好。判断去重的数组应该放在for遍历之外,代表该一层的数组元素是否重复,这个数组的位置一开始放进for遍历之内,结果子集有重复的。
2023-04-12 10:54:59
50
原创 代码随想录算法训练营第28天||93.复原IP地址、78.子集 、90.子集II
这个跟切割回文串有点类似,而且还固定分成四个数字,当分隔符有三个了以后直接对剩余部分进行判断即可,前三个进行回溯算法就能实现,其中要注意有分隔符的位置,回溯过程中要多移动一位,判断函数需要单独写一下。这个是不含重复元素的数组,子集问题是在遍历过程中就要收集结果,而且还是组合问题的话,for遍历就从StartIndex位置开始就行。这个包含重复元素,那就需要去重操作,使用used数组来表示是否重复,相当于之前的子集问题+去重的组合题。没啥问题,在回溯开头就先收集一下结果就行,其他操作都是回溯基础模板。
2023-04-11 11:55:47
51
原创 代码随想录算法训练营第27天||39. 组合总和、40.组合总和II、131.分割回文串
学习了组合问题、切割问题的操作,理解了如何切割如何去重,但是实际敲代码还是比较生疏,需要多练练,之前因为出差耽误了一个周,这才刚把之前的进度补上去,现在开始继续打卡!这个和之前的216组合总和|||差不多,只不过这道题里面的元素可以重复,那就是在回溯过程上做文章,把i+1变成i,这样每次遍历都是从头开始遍历的。这道题的重难点在于如何去重,是在同一树层内去重,因此应该在for遍历中进行去重操作,设定一个数组来依次对应各个元素是否重复。没啥困难,剪枝操作还是需要熟练一下。如何去进行去重判断的操作有点陌生。
2023-04-10 18:21:26
82
原创 代码随想录算法训练营第十四天||104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
判断对称,是需要判断内外侧的子节点是否相等,这样的话,遍历顺序根节点始终是在最后,所以只能用后序遍历的思路来解决,依旧用递归的方法来写代码,确定传入参数和返回值(左右子节点、真假)、终止条件(左右节点的判断情况)、单层递归逻辑(左右节点的内外侧子节点是否相等),理清楚这递归三要素之后,就能轻松解出这道题。运用队列的方式实现层序遍历,并且每层遍历的时候会先提前记一下size,这样就能知道每层需要出几个数了,然后把下一层的左右子节点输入队列中,从而进行迭代即可。
2023-04-03 11:37:53
63
原创 代码随想录算法训练营第十二天||二叉树的基础理论、递归遍历、迭代遍历
今日学习了二叉树的基础理论知识,对于二叉树这个新知识点,需要不断的重复熟练,把递归遍历以及迭代遍历二叉树得敲很多遍才能熟练起来,对之后的二叉树练习题很重要,希望继续坚持下去,今日学习2.5h!通过栈来实现迭代遍历,要记得栈是先进后出,所以针对三种遍历进出的元素顺序不一样,其中前后序遍历可以通过翻转实现互通,但是中序的话会有些麻烦,得需要用指针去不断的判断从而实现中序遍历。只要理清楚三个要素:确定递归函数的参数和返回值、确定终止条件、确定单层递归的逻辑,递归法就会写的很清楚。
2023-04-01 20:29:38
46
原创 代码随想录算法训练营第十一天||239. 滑动窗口最大值、347.前 K 个高频元素
确实可以用一个单调队列实现,但是只需要维护出口的元素(也就是最大值)即可,不需要维护所有的元素,分别进行pop、push、getmaxvalue即可,然后移动窗口进行取值操作,这个思路得好好熟练理解。个人第一时间看法:这里应该跟之前哈希表里面的题有点类似,统计元素出现的频率,可以用map结构记录key和value,但是这个频率的排序,如果用遍历的话,是不是复杂度就会变大了,栈与队列的话应该咋办呢?不会用python中堆的操作,这一遍只能对着代码一行一行的去理解+敲。239. 滑动窗口最大值。
2023-03-27 23:42:51
118
原创 代码随想录算法训练营第十天||20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
可以用二叉树的知识去理解,只不过现在二叉树还没学习,所以看起来有些吃力,从栈的角度来看的话比较容易理解,就是当遇到运算符的时候就把运算符之前的两个数进行运算然后把结果放进去即可,最后会得到一个最终结果,然后pop出来就好。第一反应,是不是可以考虑用双指针法,但是判断完第一遍重复之后,还有可能继续重复,这时候不是简单的双指针了,看看得考虑用栈了。学习了栈的一些基础操作,更好的去理解栈的运用场景,逐渐熟练栈的操作,今日学习1.5h!确实用栈的话要简单许多,遇到重复的话就pop掉,没有重复的就push进去即可。
2023-03-25 11:29:15
42
原创 代码随想录算法训练营第九天||232.用栈实现队列、225. 用队列实现栈
学习了栈与队列的基础知识以及简单的互换操作,对于没有了解过的这方面,还得继续下功夫去学习,早日实现Python、c++双语言,今日学习时长1h!
2023-03-24 11:27:32
51
原创 代码随想录算法训练营第八天||28. 实现 strStr()、459.重复的子字符串、字符串总结、双指针回顾
今天的学习任务较轻,由于是一刷,对于KMP算法一点都不了解,此次只是通过视频讲解,来对该算法的思路做一下了解,暂时没有掌握,等到之后算法思路能够较为熟练的搭建了,再回过头来掌握KMP算法,并对之前做过的字符串、双指针的算法题进行了回顾,今日学习时长2h!
2023-03-23 15:08:11
56
原创 代码随想录算法训练营第七天||344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词、剑指Offer58-II.左旋转字符串
今天的字符串操作学习,感觉更多是的熟练双指针的操作,还涉及到了Python中的切片操作,看似Python的切片更加简洁,但实际底层运行中还是较为复杂的,运行效率并没有那么高效,今日学习2.5h!如果新建数组的话特别简单,直接遍历填充就行,但是要求在原数组操作的话,就不太清楚了,毕竟数组是连续的,填充一个空格的话,需要把后面的都往后移,比较麻烦。清除前后的空格倒是很简单,中间的多余空格的话,得新建个数组?遍历不止单个的遍历,也可以2k个的遍历,这样的话就相当于一次处理2k个,然后不足2k的时候有另外的处理。
2023-03-23 10:05:08
34
原创 代码随想录算法训练营第六天||454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
今天第一道题也是运用了map的结构进行操作,整体的思路就是看看能不能构成两个组,从而进行哈希表操作解题,第二题就是跟之前的题目进行变式训练而已,熟练操作,第三四题巧妙的运用题目要求,进行排序从而可以使用双指针法进行解题,而且其中的剪枝去重操作格外需要注意细节,仍需多多磨练!基于四数相加和三数之和的思路,既然不需要返回下标,那就可以先排序,进而可以运用双指针,在三个指针的基础上,再在左端加一个指针,前两个为一组,后两个为一组进行操作,挨个遍历从而实现四数之和应该就可以。这就是一道最基础的哈希表操作题。
2023-03-21 14:46:04
59
原创 代码随想录算法训练营第五天||242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
此次要用set结构体,而且对于不需要排序数据、不需要重复数据的情况下,推荐要用unordered_set,而且对于重复的情况时,可以先赋值原数组该数的位置为1,然后第二个数组的数据如果相交,则需要将该数投入结果数组当中,并把原数组该数的位置-1,从而与一开始的判断条件呼应,不会出现重复情况。今日学习时长3.5h!LeetCode 202. 快乐数。349. 两个数组的交集。242.有效的字母异位词。
2023-03-20 19:40:37
47
原创 代码随想录算法训练营第四天|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
学习了三个节点的交换操作,删除倒数某个节点的双指针方法很巧妙,值得仔细的数学推导,链表相交题较为基础,环形链表学到了如何用双指针判断环以及找到环的位置,链表操作还是需要反复磨炼,今日学习3h!巧妙的运用双指针进行数学关系分析,快的走两步慢的走一步,一定会在环内相遇,然后再定义两个指针根据数学关系式就能得出环的入口处,这数学推理属实精妙,得反复琢磨才行。看到19的第一时间,想的是先得到整个链表的长度,然后直接循环指针定位到要删除的节点的前一个,直接连接到后一个节点即可。19.删除链表的倒数第N个节点。
2023-03-18 20:58:02
38
原创 代码随想录算法训练营第三天|203.移除链表元素、707.设计链表、206.反转链表
学习了链表的基础操作,并且尝试用递归法进行解决,又多了一种思路,链表相对来说,只要画过图思路就比较清晰了,相比数组的话感觉难度相差不大,今天不仅用python,还用c++试了试,感觉用两种语言的话,学习速度的确会慢一点,今日学习时长将近3h!一开始忽略了在开头的情况,如果不用虚拟头结点的话,还得分情况讨论,但是用虚拟头结点的话就可以统一格式进行链表操作了。实际敲的时候,在后几个函数中可以运用前几个函数的时候没有注意到,还在傻呆呆的挨行敲代码。麻了,看着一下子写五个函数,属实头大,有点投入不进去。
2023-03-17 21:28:56
31
原创 代码随想录算法训练营第二天|977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵||
又一次运用了双指针法,可见这一方法确实比较好用,滑动窗口法跟双指针法有点类似,只要记住循环的是终止位置,这样思路就不会乱,这个螺旋矩阵一上来属实整懵了,但实际自己先几圈就能发现有规律的,将二分法里面的循环不变区间好好的运用了一遍,第一二天的数组题都是比较典型的算法,需要不断熟练才能运用的又快又准,今日学习时长将近2h!可以用到第一天学到的双指针法,此处用的是相向双指针法,思路清晰,可以逐渐养成两方面考虑解决问题的习惯,代码比较简洁,运行效率大幅提升。
2023-03-16 20:33:52
177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人