65 lines
2.9 KiB
Markdown
65 lines
2.9 KiB
Markdown
给定一个正整数数组arr,请把arr中所有的数分成两个集合,尽量让两个集合的累加和接近.
|
|
返回:最接近的情况下,较小集合的累加和.
|
|
|
|
|
|
|
|
给定一个正整数数组arr,请把arr中所有的数分成两个集合,
|
|
如果arr长度为偶数,两个集合包含数的个数要一样多,
|
|
如果arr长度为奇数,两个集合包含数的个数必须只差一个
|
|
请尽量让两个集合的累加和接近
|
|
返回:
|
|
最接近的情况下,较小集合的累加和
|
|
|
|
|
|
|
|
## 总结
|
|
什么暴力递归可以继续优化?
|
|
有重复调用同一个子问题的解,这种递归可以优化
|
|
如果每一个子问题都是不同的解,无法优化也不用优化.
|
|
|
|
暴力递归和动态规划的关系:某一个暴力递归,有解的重复调用,就可以把这个暴力递归优化成动态规划
|
|
任何动态规划问题,都一定对应着某一个有重复过程的暴力递归
|
|
但不是所有的暴力递归,都一定对应着动态规划.
|
|
|
|
面试题和动态规划的关系
|
|
解决一个问题,可能有很多尝试方法
|
|
可能在很多尝试方法中,又有若干个尝试方法有动态规划的方式
|
|
一个问题可能有若干种动态规划的解法.
|
|
|
|
如何找到某个问题的动态规划方式
|
|
设计暴力递归:重要原则+4中常见尝试模型!重点!
|
|
分析有没有重复解:套路解决
|
|
用记忆搜索(缓存,搜索o1就是最优解否则表依赖)->用严格表结构实现动态规划:套路解决
|
|
看看能否继续优化:套路解决
|
|
|
|
面试中暴力递归过程的原则
|
|
1. 每一个可变参数的类型,一定不要比int类型更加复杂
|
|
2. 原则1.可以违反,让类型突破到一维线性结构,那必须是单一可变参数
|
|
3. 如果发现原则1.被违反,但不违反原则2.,只需要做记忆搜索即可
|
|
4. 可变参数的个数,能少则少.
|
|
|
|
知道了面试中设计暴力递归过程的原则,然后呢
|
|
一定要逼自己找到不违反原则情况下的暴力尝试
|
|
如果你找到暴力尝试,不符合原则,马上舍弃,找新的.
|
|
如果某个题目突破了设计原则,一定极难极难,面试中的概率低于5%
|
|
|
|
暴力递归到动态规划的套路
|
|
1. 你已经有了一个不违反原则的暴力递归,而且的确存在解的重复调用
|
|
2. 找到那些参数的变化会影响返回值,对每一个列出变化范围
|
|
3. 参数间的所有组合数量,意味着表大小
|
|
4. 记忆化搜索的方法就是傻缓存,非常容易得到
|
|
5. 规定好严格表的大小,分析位置的依赖顺序,然后从基础填写到最终解
|
|
6. 对于有枚举行为的决策过程,进一步优化.
|
|
|
|
动态规划的进一步优化
|
|
1. 空间压缩
|
|
2. 状态化简
|
|
3. 四边形不等式
|
|
4. 其他优化技巧
|
|
|
|
## N皇后问题
|
|
在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列,也不在同一条斜线上
|
|
给定一个整数n,返回n皇后的摆法有多少种.
|
|
n=1 返回1
|
|
n=2或3,2皇后和3皇后无论怎么摆都不行,返回0
|
|
n=8,返回92 |