注意事项
递归深度过深出错(超出时间限制)
如果提醒递归深度过深出错
就用如下的代码更改限制
1 | class Solution: |
PS : 为什么要模1000000007
(跟我念,一,八个零,七)。参考https://www.liuchuo.net/archives/645
- 大数相乘,大数的排列组合等为什么要取模
- 1000000007是一个质数(素数),对质数取余能最大程度避免结果冲突/重复
- int32位的最大值为2147483647,所以对于int32位来说1000000007足够大。
- int64位的最大值为2^63-1,用最大值模1000000007的结果求平方,不会在int64中溢出。
- 所以在大数相乘问题中,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出。
- 这道题为什么要取模,取模前后的值不就变了吗?
- 确实:取模前 f(43) = 701408733, f(44) = 1134903170, f(45) = 1836311903, 但是 f(46) > 2147483647结果就溢出了。
- _____,取模后 f(43) = 701408733, f(44) = 134903163 , f(45) = 836311896, f(46) = 971215059没有溢出。
- 取模之后能够计算更多的情况,如 f(46)
- 这道题的测试答案与取模后的结果一致。
- 总结一下,这道题要模1000000007的根本原因是标准答案模了1000000007。不过大数情况下为了防止溢出,模1000000007是通用做法,原因见第一点。
反转字符串
1 | class Solution: |
斐波那契数列
虽然简单,但是也花了时间调,主要是因为递归的时候,python中递归会超出最大的长度,需要用 @functools.lru_cache(maxsize=512)
来关闭限制。
迭代型:需要做好初值:res[0] , res[1] ,一般都需要两个初值
1 | from functools import lru_cache |
跳台阶-ii
用迭代型,还是要做好两个初值:res[1]、res[2]
PS:当台阶为零时,值为1 ??
这个特殊情况,我们不算在两个初值中
1 | class Solution: |
两两交换链表中的节点
主要要用tmp把暂时无关的节点存好
1 | # Definition for singly-linked list. |
不同的二叉搜索树-ii
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。
1 | 示例: |
主要是
- 遍历选取不同的根节点
- 然后递归获得左子树的根节点数组,右子树的根节点数组
- 然后创建根节点,遍历左右子树两个for循环,连上根节点,添加到list中
1 | # Definition for a binary tree node. |