1.关于递归与迭代
递归的性能低但是代码直观,改成迭代后子结构不变
二叉树的迭代实现?
2.动态规划
关于最大值最小值这种最值问题,一般都可以通过动态规划的方法进行判断,某些存在性问题也可以用动态规划的方法进行计算
https://leetcode.com/problems/word-break/
3.初始化数字为最大值时,可以为INT_MAX,但是记住,INT_MAX+1后为负数!!
https://leetcode.com/submissions/detail/188276800/
4.易错:
for(;;)中,如果两个分号之间的判断条件有多个,用逻辑运算符号&&与||连接,切记不要用逗号!
https://leetcode.com/submissions/detail/188428764/
5.关于超时
某些 要求打印所有可行解的题目,需要先用DP判断有没有可行解,有可行解再用DFS打印,否则可能会超时
https://leetcode.com/problems/word-break-ii/discuss/44185/Getting-rid-of-TLE
6. 关于快速排序
如果pivot是第一个数字,为什么要先从后往前找小的呢?因为会出现这种情况,比如
1,4,2,3
如果先从前往后找大的,那么最后返回的pivot是4和1交换,快速排序要求对于返回的pivot,pivot左边的数要么没有要么比pivot小,右边的数要么没有要么比pivot大
具体可见为什么一定要从右边开始
希望这个易错点我能够记得时间长点吧。。。
7.关于c++ string.substr()
string substr (size_t pos = 0, size_t len = npos) const;
如果pos的值和字符串的长度相等,返回一个空字符串
如果pos的值比字符串的长度大,抛出异常
8.关于字符串与数字互相转化
有一个巨坑,就是字符串如果太长了是无法直接转化为数字的。。。。比如一个长度为1000的字符串咋转换为数字。。
9.两个长度相同的字符串的比较
两个长度相同的字符串时可以直接进行比较的,这是c++的语言特性,比如"abb" < "abc"(按照字典序)
10.leetcode236 公共祖先,这题的思路就是本节点找不到就找两个儿子,通过两个儿子的结果来判断。。。。
11.反转链表是可以不new新node的
12.链表的排序,单向链表用归并排序,双向链表用快速排序
13.满二叉树:除了最后一层节点没有任何子节点以外,其他的节点均有两个子节点;完全二叉树:对于深度为K,有n个节点的二叉树,当且仅当每一个节点斗鱼深度为 K 的二叉树中编号为1~n的节点一一对应时,称为完全二叉树。
可以用树的层序遍历判断是不是完全二叉树;
14.快慢指针的问题
第一次相遇时,设相遇点到环入口的逆时针长度为R1,无环部分长度为L
有 2(L+R1) = L + nC, C为圆环周长
即L = nC-R1,即如果再找一个指针放在入口,慢指针放在快慢指针相遇处,那么之后一定相遇在入口处。
这题建议多看几遍,因为需要先判断能不能相遇。。
15 顺时针打印数组,这题易错,因为会出现横着把数组打印一遍然后从后到前又把数组打印一遍,或者竖着把数组打印一遍,之后又竖着从下往上把数组打印一遍的情况。
16 正则表达式,这题是我觉得最容易错的一题啦,因为空字符串也是能被匹配的。。
https://leetcode.com/problems/regular-expression-matching/
17 0-1背包是逆序:因为状态转移方程如下,很简单:
dp[i][j] = max(dp[i-1][j-weight[i]]+value[i], dp[i-1][j])
完全背包是顺序,因为状态转移方程如下
dp[i][j] = max{ dp[i-1][j-k*weight[i]]+k*value[i]}, 0 <= k*weight[i] <= j
这个状态转移方程可以转换为下面所示:
dp[i][j] = max(dp[i][j-weight[i]]+value[i], dp[i-1][j])
18 unsigned int的相反数:
sum = INT_MAX, -SUM = INT_MAX + 2的32次方
19 空树是二叉平衡树
20 硬币问题,自然数拆解问题:
硬币问题:网上各大公司经常出题目:假设现在有1元、2元、5元的纸币很多张,现在需要20块钱,你能给多少种找钱方案,这就可以认为是完全背包问题,即背包容量为20,物品体积分别为1、2、5。
自然数拆解问题:给定一个数m,将m拆成不同的自然数的和的形式有多少种方案,这就是典型的01背包问题,背包容量为m,物品件数为k,这里面的k是隐含条件,可以求出来,因为m最多由1+2+…+k得到,由此可以根据m求得物品件数的上限
01背包的状态转移公式:
dp[i][j] = dp[i-1][j], j < nums[i];
dp[i][j] = dp[i-1][j](不装) + dp[i-1][j-nums[i]](装)
完全背包的状态转移公式:
dp[i][j] = dp[i-1][j], nums[i] > j;
dp[i][j] = dp[i-1][j] + dp[i-1][j-nums[i]]+dp[i-1][j-2*nums[i]]+....+dp[i-1][j-k*nums[i]],
(nums[i] <= j < (k+1)*nums[i])
其中,nums[i] >=j时的递推公式可以优化为
dp[i][j] = dp[i-1][j], j < nums[i]
dp[i][j] = dp[i-1][j] + dp[i][j-nums[i]], j >= nums[i]
21 大数相乘问题,注意最后一位的进位。。
22.动态规划中的博弈问题,一般来说,都是令dp[i]表示先手必胜,那么,dp[i] = !dp[i-1] || !dp[i-2] || .. dp[i-k].... 即
dp[i] = !(dp[i-1] && dp[i-2] && .... && dp[i-j])