From 363cf82d546f0c1037394a86c68ff4c1f9c8d3da Mon Sep 17 00:00:00 2001 From: ranwenjie Date: Mon, 15 Nov 2021 01:20:46 +0800 Subject: [PATCH] update dp and tree --- 4 Tree/2-二叉查找树/二叉查找树.md | 2 +- 8 Algorithms Analysis/动态规划.md | 19 +++++--- 8 Algorithms Analysis/贪心算法.md | 16 ++++--- 8 Algorithms Analysis/递归.md | 48 +++++++++++++++++-- 9 Algorithms Job Interview/5 数组数列问题.md | 2 - 9 Algorithms Job Interview/7.1 二叉树-遍历.md | 6 +++ 6 files changed, 73 insertions(+), 20 deletions(-) diff --git a/4 Tree/2-二叉查找树/二叉查找树.md b/4 Tree/2-二叉查找树/二叉查找树.md index 3ce4c39..6e5ce4f 100644 --- a/4 Tree/2-二叉查找树/二叉查找树.md +++ b/4 Tree/2-二叉查找树/二叉查找树.md @@ -10,7 +10,7 @@ 4. 没有键值(key)相等的节点 -有序的二叉查找树,中序遍历结果是递增的。 +有序的二叉查找树,中序遍历结果是递增的。 `左小右大` ``` diff --git a/8 Algorithms Analysis/动态规划.md b/8 Algorithms Analysis/动态规划.md index c2ff383..eaeef85 100644 --- a/8 Algorithms Analysis/动态规划.md +++ b/8 Algorithms Analysis/动态规划.md @@ -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) 如果使用贪心策略,并不能得到最优解。 diff --git a/8 Algorithms Analysis/贪心算法.md b/8 Algorithms Analysis/贪心算法.md index f5ac09d..400c5dd 100644 --- a/8 Algorithms Analysis/贪心算法.md +++ b/8 Algorithms Analysis/贪心算法.md @@ -3,13 +3,17 @@ 不追求最优解,只找到满意解。 -#### 赫夫曼编码 - - - #### 其它案例 -找回零钱问题 -装箱问题 +* 跳跃游戏 +* 射击气球 +* 装箱问题 + +## 赫夫曼编码 + + + + + diff --git a/8 Algorithms Analysis/递归.md b/8 Algorithms Analysis/递归.md index 94f9d3f..7f6b53f 100644 --- a/8 Algorithms Analysis/递归.md +++ b/8 Algorithms Analysis/递归.md @@ -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 + +``` + + diff --git a/9 Algorithms Job Interview/5 数组数列问题.md b/9 Algorithms Job Interview/5 数组数列问题.md index 65b823d..e2b4756 100644 --- a/9 Algorithms Job Interview/5 数组数列问题.md +++ b/9 Algorithms Job Interview/5 数组数列问题.md @@ -80,8 +80,6 @@ int fib(int n) { - - ## 递减数列左移后的数组中找数 一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5} diff --git a/9 Algorithms Job Interview/7.1 二叉树-遍历.md b/9 Algorithms Job Interview/7.1 二叉树-遍历.md index c98ae50..d4d513d 100644 --- a/9 Algorithms Job Interview/7.1 二叉树-遍历.md +++ b/9 Algorithms Job Interview/7.1 二叉树-遍历.md @@ -66,6 +66,12 @@ +## 完全二叉树的节点个数 + + + + + ## 判断整数序列是不是二元查找树的后序遍历结果