动态规划
使用场景:
- 求方案总数(90%)
- 求最值(90%)
- 求可行性(80%)
不适合的场景:
- 找所有具体的方案(99%)
- 输入数据无序(除背包问题外 60%)
- 暴力算法就已经是多项式时间复杂度
动态规划的四要素:
- 状态:递归的定义
- 转移方程:递归的拆解
- 初始化:递归的出口
- 执行顺序:递归的调用
常见的动态规划:
- 背包型
- 区间型:大区间依赖小区间
- 匹配型
- 划分型
- 接龙型
求方案数
70、爬楼梯 dp[i] = dp[i-1] + dp[i-2]
https://blog.youkuaiyun.com/qq_38595487/article/details/79686081
就是斐波拉契
class Solution {
public int climbStairs(int n) {
if (n < 3) {
return n;
}
int res = 0;
int i = 1, j = 2;
for (int k = 3; k <= n; k++) {
res = i + j;
i = j;
j = res;
}
return res;
}
}
198、盗窃抢劫 dp[i] = max(dp[i-2] + nums[i], dp[i-1])
213、盗窃在环形街区抢劫
信件错排 dp[i] = (i-1)*dp[i-2] + (i-1)*dp[i-1]
母牛生产 dp[i] = dp[i-1] + dp[i-3]
64、矩阵的最小矩阵和
62、矩阵的总路径数
数组区间
301、数组区间和 前缀和
413、数组中等差递增子区间的个数 if(A[i] - A[i-1] == A[i-1] - A[i-2]) 则dp[i] = dp[i-1] + 1
分割整数
343、分割整数的最大乘积 ***
279、按平方数来分割整数
91、分割整数构成字母字符串
最长递增子序列
300、最长递增子序列 dp[n] = max{ 1, dp[i] + 1 | Si < Sn && i < n}
646 、一组整数对能够构成的最长链
376、最长摆动子序列
最长公共子序列(双序列型)
背包问题:
0-1背包 容量为N的背包 对物品的迭代在最外层
完全背包:物品数据为无限个 对物品的迭代在最里层 ***
多重背包:物品数量有限制
多维费用背包:物品不仅有重量,还有体积
其他:物品之间相互约束或依赖
416、划分数组为相等的两部分 可看成一个背包大小为sum/2的0-1背包问题
494、改变一组数的正负号使得它们的和为一给定数 可以0-1背包或DFS
139、字符串按单词列表分割 完全背包
474、01字符构成最多的字符串 多维费用的0-1背包问题
322、找零钱的最少硬币数 完全背包
377、组合总和 完全背包
股票交易
309、需要冷静期的股票交易
714、需要交易费用的股票交易
123、只能进行两次的股票交易
188、只能进行K次的股票交易
字符串编辑
583、删除两个字符串的字符使它们相等 -> 可转化为最长公共子序列问题
72、编辑距离
650、复制粘贴字符
数字
最大公约数gcd return b==0 ?a : gcd(b, a % b);
最大公倍数lcm return a * b / gcd(a, b);
素数
204、生成素数序列
进制转换
504、7进制
405、 16进制
168、 26进制
阶乘
172、统计阶乘尾部有多少个0 *** 百度面试题 尾部的0由2*5得到
字符串加法减法
67、二进制加法
415、字符串加法
相遇问题
462、改变数组元素使所有的数组元素都相等
多数投票问题
169、数组中出现次数多于n/2的元素
其他
367、平方数 平方序列;1,4 ,9,16…. 间隔:3,5,7…
326、3的n次方
238、乘积数组 left数组和right数组,相乘
628、找出数组中的乘积最大的三个数