今天是2月15号,刷题日。
浅浅总结一波:
1.动态规划:
首先要找到动态规划方程,想明白dp[n-1]和dp[n]的关系,一般都是取最大值。
使用场景呢?就是那种莫名奇妙,想也想不明白应该怎么求出最大值,排列组合有一万种可能性的,这种人脑怎么可能列的出来,那就由程序替你完成这件事。你不需要当前的(dp[n])最大值,你只需要知道你的前一个加现在这个(dp[n-1]+nums[n]),这俩比较一下。
加粗字体就是灵魂啦!
2.递归:
递归也是一层一层想也想不明白,那怎么办呢?不想了。
三个点很重要:
第一,找到边界。你总不能无限递归吧,总要有个满足什么条件就结束了。
第二,注重当前的这一层。这一层满足什么条件才进到递归,你总要写吧。
第三,这一层与下一层。这一层和下一层是什么关系啊..怎么进到下一层啊。
总之,递归想明白这三点就够了,不用再无限的往下想了。
那什么时候使用递归呢?第一层满足这个条件,下一层也满足,也要进行一样的判断,链表、树的题大部分都需要递归。
3.树:
前序:上 左 右 (至于为什么是这个顺序,我要是没记错的话,前序是看哪个节点遍历一次)
中序:左 上 右 (同理,两次)
后序:右 上 左 (同理,三次)
(这都是深度遍历)
那代码怎么写呢?
不用想又是递归啦。
4.链表:
链表就是head代表这个链表,val代表当前节点是值,next代表下个节点开始的链表。
5.Set
Set在哪些题里用呢?
就比如一些数组的题,有重复的元素啊,有缺失的元素啊,这种,你就可以先用Set搞一个正常的数组出来,然后把在对比目标数组,
哦对了 还有一个常用的数组去重:var arr = [...new Set(targetArr)]
6.Map
说到Set就不得不提的Map,虽然今天没用到Map.
Map啥时候用呢?就是那种对应关系,因为Map的结构是{a->b,c->}这种,比如一个元素出现的次数...
7.还有一个点:
有点时候求n里边的h就非常别扭,这时候如果题目其实n-h,或者跟另一半相关,一定要想到利用另一半算。
8.还有最后最后一个:
这是我自己的反思:
1.对特殊值的处理
2.对时间、空间复杂度的处理
这都是我需要改进的地方。
还有我算法比较薄弱的地方:树、链表、贪心、二分等一堆。
我学过的:动态规划、前缀和、KMP、中心扩散法、滑动窗口,这些也要复习一下。
还有一个小小的心得:
就是这个力扣真的要经常刷,哪怕刷完忘了,但是捡起来也很快。而且第二次看之前的题,一部分就会觉得,好简单,当时居然都不会?。反正就是成为一个习惯吧。共勉。