leetcode刷题总结(持续更新)

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])

 

你可能感兴趣的:(算法与数据结构)