Skip to content

Commit 24b4c38

Browse files
committed
add 16_11
1 parent 81ed96d commit 24b4c38

File tree

3 files changed

+152
-0
lines changed

3 files changed

+152
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
| 9 | [Palindrome Number][0009] | Math |
3333
| 13 | [Roman to Integer][0013] | Math, String |
3434
| 14 | [Longest Common Prefix][0014] | String |
35+
| 16.11| [跳水板(Diving Board LCCI)][16_11] | 递归、记忆化 |
3536
| 20 | [Valid Parentheses][0020] | Stack, String |
3637
| 21 | [Merge Two Sorted Lists][0021] | Linked List |
3738
| 26 | [Remove Duplicates from Sorted Array][0026] | Array, Two Pointers |
@@ -121,6 +122,7 @@
121122
[0009]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0009/README.md
122123
[0013]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0013/README.md
123124
[0014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0014/README.md
125+
[16_11]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/16_11/README.md
124126
[0020]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0020/README.md
125127
[0021]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0021/README.md
126128
[0026]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0026/README.md

note/16_11/README.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# [跳水板(Diving Board LCCI)][title]
2+
3+
## 题目描述
4+
5+
你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为`shorter`,长度较长的木板长度为`longer`。你必须正好使用`k`块木板。编写一个方法,生成跳水板所有可能的长度。
6+
7+
返回的长度需要从小到大排列。
8+
9+
**示例:**
10+
11+
```
12+
输入:
13+
shorter = 1
14+
longer = 2
15+
k = 3
16+
输出: {3,4,5,6}
17+
```
18+
19+
**提示:**
20+
21+
* 0 < shorter <= longer
22+
* 0 <= k <= 100000
23+
24+
**标签:** 递归、记忆化
25+
26+
27+
## 思路
28+
29+
这题乍一看,好像得用递归或动态规划来解,仔细一想,其实就是高中数学学过的等差数列知识。
30+
31+
`k == 0` 时,返回 `[]` 即可;
32+
33+
`shorter == longer` 时,返回 `[k * shorter]` 即可;
34+
35+
`shorter != longer` 时,那么其实就是一个首项为 `k * shorter`,末项为 `k * longer`,公差为 `longer - shorter` 的等差数列么;
36+
37+
我们根据以上情况就可以写出如下代码了:
38+
39+
40+
```java
41+
public class Solution {
42+
public int[] divingBoard(int shorter, int longer, int k) {
43+
if (k == 0) {
44+
return new int[0];
45+
}
46+
if (shorter == longer) {
47+
return new int[]{shorter * k};
48+
}
49+
int[] ans = new int[k + 1];
50+
int st = k * shorter;// 等差数列的首项
51+
int delta = longer - shorter;// 公差
52+
for (int i = 0; i <= k; i++) {
53+
ans[i] = st + i * delta;
54+
}
55+
return ans;
56+
}
57+
}
58+
```
59+
60+
61+
## 思路 1
62+
63+
基于上面的思路,其实我们没有必要把所有层级都保存下来,由于是先序遍历,在找待插入节点它爹时,我们可以把不小于它层级的元素都删除,基于此,用一个辅助栈便可完成寻爹之旅,具体如下所示:
64+
65+
```java
66+
/**
67+
* Definition for a binary tree node.
68+
* public class TreeNode {
69+
* int val;
70+
* TreeNode left;
71+
* TreeNode right;
72+
* TreeNode(int x) { val = x; }
73+
* }
74+
*/
75+
public class Solution {
76+
public TreeNode recoverFromPreorder(String S) {
77+
char[] chars = S.toCharArray();
78+
int len = chars.length;
79+
LinkedList<TreeNode> stack = new LinkedList<>();
80+
for (int i = 0; i < len; ) {
81+
int level = 0, val = 0;
82+
while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢
83+
++i;
84+
++level;
85+
}
86+
while (i < len && chars[i] != '-') { // 获取节点的值
87+
val = val * 10 + chars[i++] - '0';
88+
}
89+
TreeNode curNode = new TreeNode(val);
90+
while (stack.size() > level) { // 栈顶不是父亲,栈顶出栈
91+
stack.removeLast();
92+
}
93+
if (level > 0) {
94+
TreeNode parent = stack.getLast();
95+
if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。
96+
parent.left = curNode;
97+
} else {
98+
parent.right = curNode;
99+
}
100+
}
101+
stack.addLast(curNode);
102+
}
103+
return stack.get(0);
104+
}
105+
}
106+
```
107+
108+
109+
## 结语
110+
111+
如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl]
112+
113+
114+
115+
[title]: https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal
116+
[ajl]: https://github.com/Blankj/awesome-java-leetcode
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.blankj.easy._16_11;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* <pre>
7+
* author: Blankj
8+
* blog : http://blankj.com
9+
* time : 2020/07/08
10+
* desc :
11+
* </pre>
12+
*/
13+
public class Solution {
14+
public int[] divingBoard(int shorter, int longer, int k) {
15+
if (k == 0) {
16+
return new int[0];
17+
}
18+
if (shorter == longer) {
19+
return new int[]{shorter * k};
20+
}
21+
int[] ans = new int[k + 1];
22+
int st = k * shorter;// 等差数列的首项
23+
int delta = longer - shorter;// 公差
24+
for (int i = 0; i <= k; i++) {
25+
ans[i] = st + i * delta;
26+
}
27+
return ans;
28+
}
29+
30+
public static void main(String[] args) {
31+
Solution solution = new Solution();
32+
System.out.println(Arrays.toString(solution.divingBoard(1, 2, 3)));
33+
}
34+
}

0 commit comments

Comments
 (0)