update dp and tree

This commit is contained in:
ranwenjie
2021-11-15 01:20:46 +08:00
parent 4d67d29412
commit 363cf82d54
6 changed files with 73 additions and 20 deletions
+12 -7
View File
@@ -24,21 +24,22 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
* Fibonacci数列 [代码参考这里 递归](./递归.md)
* 凑零钱问题
* 股票问题 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/list/stock/BestChance.java)
* 二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java)
* 链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java)
* 接雨水问题
* 打家劫舍问题 : num[i] 代表第i个房子中的现金数目,从房子中取钱的最大数目,约束是相邻房子的钱不能同时取出
* 接雨水问题 :
* 青蛙跳阶问题: 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。
* 最小编辑距离
* 最长递增子序列 (LIS Longest Increasing Subsequence)
* 最长递增子序列 (LIS Longest Increasing Subsequence),如`【5,6,7,3,2,8】` 最长子序列 `【5,6,7,8】`, 输出4
* 最大子数组和
* 最长公共子序列 (LIS Longest public Subsequence)
* 最长回文子序列 (LIS Longest public Subsequence)
* 0-1 背包问题
[更多动态规划案例代码实现参考deep-in-java])(https://github.com/nonstriater/deep-in-java/tree/master/src/main/java/com/nonstriater/deepinjava/algo/framework/dynamic)
青蛙跳阶问题
```
# 青蛙跳阶问题
想跳到第10级台阶,要么是先跳到第9级,然后再跳1级台阶上去;要么是先跳到第8级,然后一次迈2级台阶上去。
同理,要想跳到第9级台阶,要么是先跳到第8级,然后再跳1级台阶上去;要么是先跳到第7级,然后一次迈2级台阶上去。
要想跳到第8级台阶,要么是先跳到第7级,然后再跳1级台阶上去;要么是先跳到第6级,然后一次迈2级台阶上去
@@ -53,6 +54,10 @@ DP通常基于一个递推公式及一个(或多个)初始状态,当前子问
```
### DP VS 分治法
与[分治法](分治算法.md)不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。
@@ -93,7 +98,7 @@ for 状态1 in 状态1的所有取值:
## 凑零钱问题
凑零钱问题[视频解读参考这里]()
凑零钱问题[视频解读参考这里](https://www.ixigua.com/6881883015832666635?wid_try=1)
如果使用贪心策略,并不能得到最优解。
+10 -6
View File
@@ -3,13 +3,17 @@
不追求最优解,只找到满意解。
#### 赫夫曼编码
#### 其它案例
找回零钱问题
装箱问题
* 跳跃游戏
* 射击气球
* 装箱问题
## 赫夫曼编码
+44 -4
View File
@@ -15,6 +15,7 @@
递归运行效率较低,因为有函数调用的开销,递归多次也可能造成栈溢出。
### 递归公式
[快排](../6%20Sort/README.md)
@@ -72,11 +73,12 @@ void traverse(TreeNode root) {
### 其它案例
* 斐波那契数列
* 阶乘计算
* 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案)
* 快速排序
* 很多树算法都是递归思想实现
* 快速排序
* 链表翻转
* 很多树算法都是递归思想实现, 如 二叉树的最近公共祖先
* 梵塔问题 (三根针1,2,3表示,1号从小到大n个盘子,先要都移到3号上,不能出现大盘压小盘,找出移动次数最少的方案)
## 斐波那契数列
@@ -196,6 +198,44 @@ public static LinkedNode mergeSeqLink(LinkedNode l1, LinkedNode l2){
## 链表翻转
链表翻转 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/link/ReverseLink.java)
```Java
//翻转链表前n个节点
static LinkedNode tmp;//需要一个外部的临时变量
public static LinkedNode reverseN(LinkedNode head, int n){
//LinkedNode tmp = null;
if (n == 1) {
tmp = head.next;
return head;
}
LinkedNode tail = reverseN(head.next, n-1);
head.next.next = head; //后n-1个节点 与 第 1 个节点 指向 翻转
head.next = tmp;
return tail;
}
```
## 二叉树的最近公共祖先
二叉树的最近公共祖先 [代码参考这里](https://github.com/nonstriater/deep-in-java/blob/master/src/main/java/com/nonstriater/deepinjava/algo/tree/CommonParent.java)
```Java
```