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

Commit 59640f2

Browse files
author
tao
committed
add some new files
1 parent 91ec603 commit 59640f2

File tree

6 files changed

+212
-0
lines changed

6 files changed

+212
-0
lines changed

BFS/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
### BFS专题学习
2+
3+
#### 介绍
4+
5+
BFS 叫广度优先搜索(bread first search), 是一种常见的搜索算法。广度优先搜索的例子和解释有很多, 这里不再详细赘述。
6+
7+
这里想介绍一下bfs的相关模版,然后会有相关的题解练习。
8+
9+
BFS要用到队列的特性来完成。队列的常见特性是先进先出,利用这个特性,我们可以很好的完成搜索。
10+
11+
```java
12+
Queue<T> q = new LinkedList();
13+
q.add(start_position);
14+
while (!q.isEmpty()) {
15+
T t = q.poll();
16+
if (something is connected to t) {
17+
q.add(something);
18+
}
19+
}
20+
```
21+
22+
这就是bfs的模版了。我们搜索的重点, 是入队条件的判定,我们到底要把什么样的东西入队呢?我们可以好好思考。
23+
24+
25+
26+
#### 做题记录
27+
28+
话不多说, 上code:
29+
30+
- [leetcode 130]()

DP/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
### 动态规划
2+
3+
这章记录我的动态规划之路。
4+
5+
相信大家学习动态规划的时候都感觉这个技巧好神奇,好有用。
6+
7+
8+
9+
[leetcode 120 三角形路径和](DP/leetcode120.md)
10+
11+
[leetcode 64最小路径和](DP/leetcode64.md)
12+

DP/leetcode120.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
### 描述
2+
3+
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
4+
5+
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
6+
7+
8+
9+
例如,给定三角形:
10+
11+
[
12+
[**2**],
13+
[**3**,4],
14+
[6,**5**,7],
15+
[4,**1**,8,3]
16+
]
17+
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
18+
19+
20+
[点击此处查看原题](https://leetcode-cn.com/problems/triangle)
21+
22+
### 思路
23+
24+
我的思维过程可能旁人看起来会比较奇怪。既然谈到动态规划,我们首先想到的是状态转移方程怎么列出来。OK, 我们来想这个题,
25+
26+
我们来看一个小一点的例子:
27+
28+
```java
29+
1
30+
/ \
31+
2 3
32+
```
33+
34+
这里, 我们发现,我们最短的路径是 1 + 2, 因为在1 可以去到的通路上,2是最小的值。
35+
36+
那么我们稍微归纳一下,假设我们有个函数可以完成这样的一件事情:
37+
38+
```java
39+
public int minSum(int[][] arr, int i, int j)
40+
// i 表示第 i 行, j 表示第 j 个数字
41+
// 这个函数我们假设已经写出来,能够帮我们找到,在arr[i][j]位置上的最短路径和。
42+
// 比如, 上面小三角形的例子, minSum(arr, 0, 0) = 3
43+
```
44+
45+
46+
47+
那么抽象点,我们的状态转移方程就是:
48+
49+
```java
50+
minSum(arr, i, j) = Math.min(minSum(arr, i+1, j), minSum(arr, i+1, j+1))
51+
```
52+
53+
我的解决递归的思路是,先写出一个暴力的递归解,然后我们可以来优化他。(那种一眼秒出答案的神仙不是我,是tth)
54+
55+
```java
56+
public int minSum(int[][] arr, int i, int j) {
57+
if (i == arr.length - 1) {
58+
// 在数组的最下面一列,我们自然返回他自己。
59+
return arr[i][j];
60+
}
61+
int res = Math.min(minSum(arr, i+1, j), minSum(arr, i+1, j+1));
62+
return res;
63+
}
64+
```
65+
66+
我们稍微把递归树给画出来,我们可以发现这样的一个规律:
67+
68+
```java
69+
// 为了方便,我直接拿上图的数字作为函数的参数了。
70+
minSum(2) = Math.min(minSum(3), minSum(4))
71+
minSum(3) = Math.min(minSum(6), **minSum(5)**)
72+
minSum(4) = Math.min(**minSum(5)**, minSum(7))
73+
.
74+
.
75+
.
76+
```
77+
78+
可以发现,如果单纯的递归,我们会发现在计算 minSum(3) 和 minSum(4)的时候, minSum(5)被重复计算了。
79+
80+
我们可以开额外的空间,把这个东西记住,就减少了不必要的计算。
81+
82+
上我的题解:
83+
84+
```java
85+
86+
public int minimumTotal(List<List<Integer>> triangle) {
87+
int n = triangle.size();
88+
int[][] f = new int[n][n];
89+
f[0][0] = triangle.get(0).get(0);
90+
for (int i = 1; i < n; ++i) {
91+
f[i][0] = f[i - 1][0] + triangle.get(i).get(0);
92+
for (int j = 1; j < i; ++j) {
93+
f[i][j] = Math.min(f[i - 1][j - 1], f[i - 1][j]) + triangle.get(i).get(j);
94+
}
95+
f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);
96+
}
97+
int minTotal = f[n - 1][0];
98+
for (int i = 1; i < n; ++i) {
99+
minTotal = Math.min(minTotal, f[n - 1][i]);
100+
}
101+
return minTotal;
102+
}
103+
```
104+
105+
虽然不是双百,但是也能看吧。。。。。。

DP/leetcode64.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
2+
3+
### 描述
4+
5+
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
6+
7+
说明:每次只能向下或者向右移动一步。
8+
9+
示例:
10+
11+
输入:
12+
[
13+
[1,3,1],
14+
[1,5,1],
15+
[4,2,1]
16+
]
17+
输出: 7
18+
解释: 因为路径 1→3→1→1→1 的总和最小。
19+
20+
21+
原题链接: https://leetcode-cn.com/problems/minimum-path-sum
22+
23+
### 思路
24+
25+
如果你看过前面 120 的题解,相信这题你可以秒杀。
26+
27+
本质上,他还是开额外的空间,来避免重复的计算。
28+
29+
这题跟120 题很类似,如果你没思路,可以按照我那个思路来写。
30+
31+
### 题解
32+
33+
```java
34+
public int minPathSum(int[][] grid) {
35+
36+
int m = grid.length;
37+
int n = grid[0].length;
38+
39+
int[][] dp = new int[m][n];
40+
int sum = 0;
41+
for (int i = 0; i < n; i++) {
42+
sum += grid[0][i];
43+
dp[0][i] = sum;
44+
}
45+
sum = 0;
46+
for (int i = 0; i < m; i++) {
47+
sum += grid[i][0];
48+
dp[i][0] = sum;
49+
}
50+
for (int i = 1; i < m; i++) {
51+
for (int j = 1; j < n; j++) {
52+
dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
53+
}
54+
}
55+
return dp[m-1][n-1];
56+
57+
}
58+
```
59+

_sidebar.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
* [栈和队列](stack_queue/)
66
* [递归学习](recursive/)
77
* [C Style Guide](myself/c_style_guide.md)
8+
* [BFS](BFS/)
9+
* [DP](DP/)

binaryTree/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,3 +368,7 @@ public List<List<Integer>> levelOrder(TreeNode root) {
368368

369369
思路我们有了,那我们来看代码怎么写:
370370

371+
```java
372+
373+
```
374+

0 commit comments

Comments
 (0)