Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 47892fa

Browse files
author
tao
committed
add some content on recursive part
1 parent 7553dac commit 47892fa

File tree

4 files changed

+128
-2
lines changed

4 files changed

+128
-2
lines changed

DP/README.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,64 @@
1-
### 动态规划
1+
### 动态规划
22

33
这章记录我的动态规划之路。
44

55
相信大家学习动态规划的时候都感觉这个技巧好神奇,好有用。
66

7+
#### 简介
78

9+
相信什么是动态规划应该不需要我这里多赘述了。我这里想写写我自己的个人心得体会,作为自己的一个学习记录,看到这里的朋友,也可以交流思考。
10+
11+
#### 解决问题的思考过程
12+
13+
我们应该来一道题作为例子:
14+
15+
- leetcode 300 最长上升子序列
16+
17+
这个题目的要求是,给我们一个**无序**的整数数组,找到其中最长的递增**子序列**。 我这里把关键字给高亮了,注意一点,子序列是数组的一个子集,可以不用连续,子串则必须连续。
18+
19+
---
20+
21+
最初的思考过程,相信很多人直接暴力来搜。这里给个大概的代码模版如下:
22+
23+
```java
24+
int max = 0
25+
for (int i = 0; i < arr.length; i++) {
26+
int start = arr[i];
27+
int len = 0;
28+
for (int j = i; j < arr.length; j++) {
29+
if (arr[j] > start) {
30+
start = arr[j]
31+
len++;
32+
}
33+
}
34+
if (len > max) {
35+
max = len
36+
}
37+
}
38+
return max
39+
40+
```
41+
42+
这样做的方法的确可以做出结果,但是太丑。
43+
44+
我们来稍微改进一下我们的思维过程,既然讲到动态规划,我们应该想到的是,**能否将问题规模减小**
45+
46+
一般有很多方法来减小问题规模,比如线性减少,我们考虑把数组规模每次减小一半试试看? 每次减小一个数字?
47+
48+
我们来试试看第一种思路,即减少一半:
49+
50+
假定我们给一个数组, `[10, 9, 2, 5, 3, 7, 101, 18]`
51+
52+
我们减小一半我们得到两个数组:
53+
54+
- `[10, 9, 2, 5]`
55+
- `[3, 7, 101, 18]`
56+
57+
的确问题的规模变小,但是好像难以找到把子问题的解组合在一起的方法。
58+
59+
我们来看第二种,每次减小一个
60+
61+
我们设计一个
862

963
[leetcode 120 三角形路径和](DP/leetcode120.md)
1064

linkedlist/leetcode19.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,13 @@ public ListNode removeNthFromEnd(ListNode head, int n) {
4040
}
4141
```
4242

43+
```java
44+
45+
void addLeaf(TreeNode root, int k) {
46+
if (root == null) return;
47+
if (root.left == null && root.right == null) root.val += k;
48+
addLeaf(root.left, k);
49+
addLeaf(root.right, k);
50+
}
51+
```
52+

recursive/Leetcode617.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
### 题目描述
2+
3+
4+
5+
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
6+
7+
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
8+
9+
示例 1:
10+
11+
```
12+
输入:
13+
Tree 1 Tree 2
14+
1 2
15+
/ \ / \
16+
3 2 1 3
17+
/ \ \
18+
5 4 7
19+
输出:
20+
合并后的树:
21+
3
22+
/ \
23+
4 5
24+
/ \ \
25+
5 4 7
26+
```
27+
28+
29+
30+
[原题链接](https://leetcode-cn.com/problems/merge-two-binary-trees/)
31+
32+
### 分析
33+
34+
这题属于简单题范畴。 拿出来分析这题是想记录一下递归。递归我们可能会分析一下出口:
35+
36+
- 如果有一个节点为空,返回另一个
37+
38+
递归下去的条件是:
39+
40+
- 两者都不为空,创建新节点,节点值为两个树节点的和。
41+
42+
43+
44+
### 代码
45+
46+
```java
47+
class Solution {
48+
49+
public TreeNode helper(TreeNode t1, TreeNode t2) {
50+
if (t1 == null) return t2;
51+
if (t2 == null) return t1;
52+
TreeNode root = new TreeNode(t1.val + t2.val);
53+
root.left = helper(t1.left, t2.left); // 递归下去
54+
root.right = helper(t1.right, t2.right);
55+
return root; // 这里是树的先序遍历
56+
}
57+
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) {
58+
return helper(t1, t2);
59+
}
60+
}
61+
```
62+

recursive/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
hello
1+
- [Leetcode617合并二叉树题解](recursive/Leetcode617.md)

0 commit comments

Comments
 (0)