Skip to content

Commit 17b92fc

Browse files
committed
完成 95,重新完成96
1 parent cbf14b3 commit 17b92fc

File tree

8 files changed

+158
-11
lines changed

8 files changed

+158
-11
lines changed

README.adoc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -668,12 +668,12 @@
668668
|Medium
669669
|
670670

671-
//|95
672-
//|{leetcode_base_url}/unique-binary-search-trees-ii/[Unique Binary Search Trees II]
673-
//|{source_base_url}/_0095_UniqueBinarySearchTreesII.java[Java]
674-
//|{doc_base_url}/0095-unique-binary-search-trees-ii.adoc[Note]
675-
//|Medium
676-
//|
671+
|95
672+
|{leetcode_base_url}/unique-binary-search-trees-ii/[Unique Binary Search Trees II]
673+
|{source_base_url}/_0095_UniqueBinarySearchTreesII.java[Java]
674+
|{doc_base_url}/0095-unique-binary-search-trees-ii.adoc[Note]
675+
|Medium
676+
|
677677

678678
|96
679679
|{leetcode_base_url}/unique-binary-search-trees/[Unique Binary Search Trees]

docs/0095-unique-binary-search-trees-ii.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
[#0095-unique-binary-search-trees-ii]
12
= 95. Unique Binary Search Trees II
23

34
https://leetcode.com/problems/unique-binary-search-trees-ii/[LeetCode - Unique Binary Search Trees II]
@@ -34,3 +35,5 @@ The above output corresponds to the 5 unique BST's shown below:
3435
include::{sourcedir}/_0095_UniqueBinarySearchTreesII.java[]
3536
----
3637

38+
这道题用到了回溯思想!昨天突击,又重新看了一遍回溯。有个模糊影响,但是还是要加强练习。
39+

docs/0096-unique-binary-search-trees.adoc

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
[#0096-unique-binary-search-trees]
12
= 96. Unique Binary Search Trees
23

34
:stem: latexmath
@@ -29,14 +30,48 @@ Given n = 3, there are a total of 5 unique BST's:
2930

3031
给定序列 `1 ... n`,我们选出数字 `i` 作为根,则对于根 `i` 的不同二叉搜索树数量 latexmath:[F(i, n)],是左右子树个数的笛卡尔积,如下图所示:
3132

32-
image::images/0096-1.png[]
33+
image::images/0096-01.png[]
34+
35+
image::images/0096-02.png[]
36+
37+
== 公式推到过程
38+
39+
[asciimath]
40+
++++
41+
42+
G_{(n)} \text { 长度为 n 的序列能构成的不同二叉搜索树的个数 }
43+
44+
45+
F_{(i, n)} \text { 以 i 为根、序列长度为 n 的不同二叉搜索树个数 (1≤i≤n)。 }
46+
47+
48+
G_{n}=\sum_{i=1}^{n} F_{(i, n)} = F_{(1, n)} + F_{(2, n)} + ... + F_{(n-1, n)} + F_{(n, n)}
49+
50+
51+
F_{(i, n)} = G_{(i-1)} \cdot G_{(n-i)}
52+
53+
54+
G_{(n)} = \sum_{i=1}^n G_{(i-1)} \cdot G_{(n-i)} = G_{0} \cdot G_{(n-1)} + ... + G_{(n-1)} \cdot G_{0}
55+
56+
57+
C_{n+1}=\frac{2(2 n+1)}{n+2} C_{n} \text { 明安图数 或 卡特兰数}
58+
++++
59+
60+
TIP: 注意:题目要是二叉搜索树!
3361

3462
没想到这里还埋了一个数学知识:Catalan number:
3563

3664
[asciimath]
3765
++++
3866
C_{0}=1 \quad \text { and } \quad C_{n+1}=\sum_{i=0}^{n} C_{i} C_{n-i} \quad \text { for } n \geq 0
3967
68+
69+
C_{0}=1 \text { and } C_{1}=1
70+
71+
72+
C_{n}=\sum_{i=1}^{n} C_{i-1} C_{n-i} \quad
73+
74+
4075
C_{0}=1, \quad C_{n+1}=\frac{2(2 n+1)}{n+2} C_{n}
4176
++++
4277

@@ -73,3 +108,9 @@ Given _n_, how many structurally unique *BST's* (binary search trees) that store
73108
include::{sourcedir}/_0096_UniqueBinarySearchTrees.java[]
74109
----
75110

111+
112+
[{java_src_attr}]
113+
----
114+
include::{sourcedir}/_0096_UniqueBinarySearchTrees_2.java[]
115+
----
116+
File renamed without changes.

docs/images/0096-02.png

183 KB
Loading

pom.xml

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<asciidoctor-comment-links.version>0.0.2</asciidoctor-comment-links.version>
3232
<asciidoclet.version>2.0.0</asciidoclet.version>
3333
<asciidoctor-maven-plugin.version>3.0.0</asciidoctor-maven-plugin.version>
34+
<mavengem-wagon.version>2.0.2</mavengem-wagon.version>
3435
<gem-maven-plugin.version>3.0.3</gem-maven-plugin.version>
3536
<download-maven-plugin.version>1.9.0</download-maven-plugin.version>
3637
<exec-maven-plugin.version>3.3.0</exec-maven-plugin.version>
@@ -101,22 +102,49 @@
101102
<version>${maven-javadoc-plugin.version}</version>
102103
<configuration>
103104
<source>${java.version}</source>
104-
<doclet>org.asciidoctor.Asciidoclet</doclet>
105+
<!-- https://github.com/asciidoctor/asciidoclet -->
106+
<doclet>org.asciidoctor.asciidoclet.Asciidoclet</doclet>
105107
<docletArtifact>
106108
<groupId>org.asciidoctor</groupId>
107109
<artifactId>asciidoclet</artifactId>
108110
<version>${asciidoclet.version}</version>
109111
</docletArtifact>
112+
<additionalJOptions>
113+
<additionalJOption>-J--add-exports=jdk.javadoc/jdk.javadoc.internal.tool=ALL-UNNAMED</additionalJOption>
114+
<additionalJOption>-J--add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</additionalJOption>
115+
<additionalJOption>-J--add-opens=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</additionalJOption>
116+
<additionalJOption>-J--add-opens=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</additionalJOption>
117+
<additionalJOption>-Xdoclint:all,-html,-accessibility</additionalJOption>
118+
</additionalJOptions>
110119
<!--<overview>src/main/java/overview.adoc</overview>-->
111-
<additionalparam>
120+
<additionalOptions>
112121
--base-dir ${project.basedir}
113-
-r asciidoctor-diagram
122+
<!--TODO: How to use asciidoctor-diagram?-->
123+
--gem-path ${gem.path}
124+
--require asciidoctor-diagram
114125
--attribute "stem=latexmath"
115126
--attribute "icons=font"
116127
--attribute "name=${project.name}"
117128
--attribute "version=${project.version}"
118129
--attribute "title-link=https://www.diguage.com/[${project.name} ${project.version}|地瓜哥]"
119-
</additionalparam>
130+
</additionalOptions>
131+
<additionalDependencies>
132+
<additionalDependency>
133+
<groupId>org.jruby</groupId>
134+
<artifactId>jruby</artifactId>
135+
<version>${jruby.version}</version>
136+
</additionalDependency>
137+
<additionalDependency>
138+
<groupId>org.asciidoctor</groupId>
139+
<artifactId>asciidoctorj</artifactId>
140+
<version>${asciidoctorj.version}</version>
141+
</additionalDependency>
142+
<additionalDependency>
143+
<groupId>org.asciidoctor</groupId>
144+
<artifactId>asciidoctorj-diagram</artifactId>
145+
<version>${asciidoctorj-diagram.version}</version>
146+
</additionalDependency>
147+
</additionalDependencies>
120148
</configuration>
121149
</plugin>
122150
<plugin>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.diguage.algorithm.leetcode;
2+
3+
import com.diguage.algorithm.util.TreeNode;
4+
5+
import java.util.ArrayList;
6+
import java.util.Collections;
7+
import java.util.List;
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2024-06-20 11:03:26
12+
*/
13+
public class _0095_UniqueBinarySearchTreesII {
14+
/**
15+
* 参考 https://leetcode.cn/problems/unique-binary-search-trees-ii/solutions/339143/bu-tong-de-er-cha-sou-suo-shu-ii-by-leetcode-solut/[95. 不同的二叉搜索树 II - 官方题解^]
16+
*/
17+
public List<TreeNode> generateTrees(int n) {
18+
if (n == 0) {
19+
return Collections.emptyList();
20+
}
21+
return generateTrees(1, n);
22+
}
23+
24+
private List<TreeNode> generateTrees(int start, int end) {
25+
List<TreeNode> result = new ArrayList<>();
26+
if (start > end) {
27+
result.add(null);
28+
return result;
29+
}
30+
31+
for (int i = start; i <= end; i++) {
32+
List<TreeNode> leftTrees = generateTrees(start, i - 1);
33+
List<TreeNode> rightTrees = generateTrees(i + 1, end);
34+
for (TreeNode left : leftTrees) {
35+
for (TreeNode right : rightTrees) {
36+
TreeNode curr = new TreeNode(i);
37+
curr.left = left;
38+
curr.right = right;
39+
result.add(curr);
40+
}
41+
}
42+
}
43+
return result;
44+
}
45+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.diguage.algorithm.leetcode;
2+
3+
/**
4+
* = 96. Unique Binary Search Trees
5+
*
6+
* https://leetcode.com/problems/unique-binary-search-trees/[Unique Binary Search Trees - LeetCode]
7+
*
8+
* @author D瓜哥, https://www.diguage.com/
9+
* @since 2020-01-27 22:14
10+
*/
11+
public class _0096_UniqueBinarySearchTrees_2 {
12+
public int numTrees(int num) {
13+
int[] r = new int[num + 1];
14+
r[0] = 1;
15+
r[1] = 1;
16+
for (int n = 2; n <= num; n++) {
17+
for (int i = 1; i <= n; i++) {
18+
r[n] += r[i - 1] * r[n - i];
19+
}
20+
}
21+
return r[num];
22+
}
23+
24+
25+
public static void main(String[] args) {
26+
_0096_UniqueBinarySearchTrees_2 solution = new _0096_UniqueBinarySearchTrees_2();
27+
int r1 = solution.numTrees(3);
28+
System.out.println((r1 == 5) + " : " + r1);
29+
}
30+
}

0 commit comments

Comments
 (0)