- 1. 斐波那契饿数列
- 2. 最长有效括号 32
- 3. 跳跃游戏1 55
- 4. 跳跃游戏2 45
- 5. 最大子数组和 53
- 6. 不同路径 62
- 7. 不同路径2 63
- 8. 最小路径和 64
- 9. 爬楼梯 70
- 10. 编辑距离 72
- 11. 最小覆盖子串 76
- 三角形最小路径和">12. 三角形最小路径和
- 买卖股票的最佳时机">13. 买卖股票的最佳时机
- 买卖股票的最佳时机 II">14. 买卖股票的最佳时机 II
- 买卖股票的最佳时机 III">15. 买卖股票的最佳时机 III
- 乘积最大子数组">16. 乘积最大子数组
- 买卖股票的最佳时机 IV">17. 买卖股票的最佳时机 IV
- 打家劫舍">18. 打家劫舍
- 打家劫舍 II">19. 打家劫舍 II
- 最大正方形">20. 最大正方形
- 完全平方数">21. 完全平方数
- 最佳买卖股票时机含冷冻期">22. 最佳买卖股票时机含冷冻期
- 戳气球">23. 戳气球
- 零钱兑换">24. 零钱兑换
- 矩形区域不超过 K 的最大数值和">25. 矩形区域不超过 K 的最大数值和
- 青蛙过河">26. 青蛙过河
- 分割数组的最大值">27. 分割数组的最大值
- 零钱兑换 II">28. 零钱兑换 II
- 学生出勤记录 II">29. 学生出勤记录 II
- 任务调度器">30. 任务调度器
- 回文子串">31. 回文子串
- 买卖股票的最佳时机含手续费">32. 买卖股票的最佳时机含手续费
- 不同路径 III">33. 不同路径 III
- 最长公共子序列">34. 最长公共子序列
- 路径的数目">35. 路径的数目
- 36. 解码方法 91
Divide & Conquer + Optimal substructure 分治 + 最有子结构
1. 斐波那契饿数列
递归 指数 O(2^n)
public int fib(int n) {
if (n <= 1) {
return n;
}
return fib(n-1) + fib(n-2);
}
缓存
public int fib(int n, int[] memo) {
if (n <= 1) {
return n;
}
if (memo[n] == 0){
memo[n] = fib(n-1) + fib(n-2);
}
return memo[n];
}
循环
public int fib(int n) {
if (n <= 3) {
return n;
}
int a = 1, b = 2, c = 3;
for (int i = 0; i < n - 3; i++) {
a = b;
b = c;
c = a + b;
}
return c;
}
2. 最长有效括号 32