Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit cd47649

Browse files
committed
1008-1028-1340-1449-1467-1687 (6)
1 parent 7687c2e commit cd47649

File tree

13 files changed

+607
-0
lines changed

13 files changed

+607
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import java.util.ArrayDeque;
2+
import java.util.Deque;
3+
4+
public class Solution1008 {
5+
public TreeNode bstFromPreorder(int[] preorder) {
6+
Deque<TreeNode> st = new ArrayDeque<>();
7+
TreeNode root = new TreeNode(preorder[0]);
8+
st.push(root);
9+
for (int i = 1; i < preorder.length; i++) {
10+
TreeNode node = new TreeNode(preorder[i]);
11+
if (preorder[i] < st.peek().val) { // 小于栈顶元素的值,说明应该在栈顶元素的左子树
12+
st.peek().left = node;
13+
} else { // 大于栈顶元素的值,我们要找到当前元素的父节点
14+
TreeNode parent = st.peek();
15+
// 栈从栈底到栈顶是递减的
16+
while (!st.isEmpty() && preorder[i] > st.peek().val) {
17+
parent = st.pop();
18+
}
19+
parent.right = node;
20+
}
21+
// 节点压栈
22+
st.push(node);
23+
}
24+
return root;
25+
}
26+
}
27+
/*
28+
1008. 前序遍历构造二叉搜索树
29+
https://leetcode.cn/problems/construct-binary-search-tree-from-preorder-traversal/description/
30+
31+
给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。
32+
保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。
33+
二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val。
34+
二叉树的 前序遍历 首先显示节点的值,然后遍历Node.left,最后遍历Node.right。
35+
提示:
36+
1 <= preorder.length <= 100
37+
1 <= preorder[i] <= 10^8
38+
preorder 中的值 互不相同
39+
40+
单调栈 https://leetcode.cn/problems/construct-binary-search-tree-from-preorder-traversal/solutions/301677/javadai-ma-de-5chong-jie-ti-si-lu-by-sdwwld/
41+
时间复杂度 O(n)
42+
*/
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
public class Solution1028 {
2+
private char[] s;
3+
private int n, i;
4+
5+
public TreeNode recoverFromPreorder(String traversal) {
6+
s = traversal.toCharArray();
7+
n = s.length;
8+
i = 0;
9+
return dfs(0);
10+
}
11+
12+
private TreeNode dfs(int level) {
13+
// 从 i 开始构建 level 层的子树
14+
int x = 0, h = 0;
15+
int j = i;
16+
for (; j < n && s[j] == '-'; ++j) ++h;
17+
if (h < level) return null; // 非当前层节点 直接返回
18+
19+
for (; j < n && Character.isDigit(s[j]); ++j) x = x * 10 + (s[j] - '0');
20+
21+
// 是当前层节点
22+
i = j; // 更新i
23+
TreeNode node = new TreeNode(x);
24+
node.left = dfs(level + 1);
25+
node.right = dfs(level + 1);
26+
return node;
27+
}
28+
}
29+
/*
30+
1028. 从先序遍历还原二叉树
31+
https://leetcode.cn/problems/recover-a-tree-from-preorder-traversal/description/
32+
33+
我们从二叉树的根节点 root 开始进行深度优先搜索。
34+
在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。
35+
如果节点只有一个子节点,那么保证该子节点为左子节点。
36+
给出遍历输出 S,还原树并返回其根节点 root。
37+
提示:
38+
原始树中的节点数介于 1 和 1000 之间。
39+
每个节点的值介于 1 和 10 ^ 9 之间。
40+
41+
递归版本 https://leetcode.cn/problems/recover-a-tree-from-preorder-traversal/solutions/292136/cong-xian-xu-bian-li-huan-yuan-er-cha-shu-by-leetc/comments/2391035/
42+
时间复杂度:O(|traversal|),其中 |traversal| 是字符串 traversal 的长度。
43+
*/
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution1008Tests {
5+
private final Solution1008 solution1008 = new Solution1008();
6+
7+
@Test
8+
public void example1() {
9+
int[] preorder = {8, 5, 1, 7, 10, 12};
10+
TreeNode expected = TreeNode.buildTreeNode("[8,5,10,1,7,null,12]");
11+
Assertions.assertTrue(TreeNode.assertTreeNodeEquals(expected, solution1008.bstFromPreorder(preorder)));
12+
}
13+
14+
@Test
15+
public void example2() {
16+
int[] preorder = {1, 3};
17+
TreeNode expected = TreeNode.buildTreeNode("[1,null,3]");
18+
Assertions.assertTrue(TreeNode.assertTreeNodeEquals(expected, solution1008.bstFromPreorder(preorder)));
19+
}
20+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution1028Tests {
5+
private final Solution1028 solution1028 = new Solution1028();
6+
7+
@Test
8+
public void example1() {
9+
String traversal = "1-2--3--4-5--6--7";
10+
TreeNode expected = TreeNode.buildTreeNode("[1,2,5,3,4,6,7]");
11+
Assertions.assertTrue(TreeNode.assertTreeNodeEquals(expected, solution1028.recoverFromPreorder(traversal)));
12+
}
13+
14+
@Test
15+
public void example2() {
16+
String traversal = "1-2--3---4-5--6---7";
17+
TreeNode expected = TreeNode.buildTreeNode("[1,2,5,3,null,6,null,4,null,7]");
18+
Assertions.assertTrue(TreeNode.assertTreeNodeEquals(expected, solution1028.recoverFromPreorder(traversal)));
19+
}
20+
21+
@Test
22+
public void example3() {
23+
String traversal = "1-401--349---90--88";
24+
TreeNode expected = TreeNode.buildTreeNode("[1,401,null,349,88,90]");
25+
Assertions.assertTrue(TreeNode.assertTreeNodeEquals(expected, solution1028.recoverFromPreorder(traversal)));
26+
}
27+
}

‎leetcode/leetcode-13/src/main/java/Solution1278.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,6 @@ public int palindromePartition(String s, int k) {
5151
https://leetcode.cn/problems/palindrome-partitioning/
5252
132. 分割回文串 II
5353
https://leetcode.cn/problems/palindrome-partitioning-ii/
54+
1745. 分割回文串 IV
55+
https://leetcode.cn/problems/palindrome-partitioning-iv/description/
5456
*/
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.ArrayDeque;
2+
import java.util.ArrayList;
3+
import java.util.Arrays;
4+
import java.util.Deque;
5+
import java.util.List;
6+
7+
public class Solution1340 {
8+
public int maxJumps(int[] arr, int d) {
9+
int n = arr.length;
10+
11+
// arr.emplace_back(1e9);
12+
List<Integer> a = new ArrayList<>();
13+
for (int v : arr) a.add(v);
14+
a.add((int) 1e9);
15+
arr = a.stream().mapToInt(Integer::intValue).toArray();
16+
17+
// dp[i] 存储从下标 i 开始最多能跳几次
18+
int[] dp = new int[n + 1];
19+
Arrays.fill(dp, 1);
20+
Deque<Integer> st = new ArrayDeque<>(); // st是单调不增的栈
21+
22+
for (int i = 0; i < n + 1; ++i) {
23+
while (!st.isEmpty() && arr[st.peek()] < arr[i]) {
24+
List<Integer> tp = new ArrayList<>();
25+
tp.add(st.pop());
26+
// arr中所有和当前栈顶相等的值都要一起弹出
27+
while (!st.isEmpty() && arr[st.peek()] == arr[tp.getFirst()]) {
28+
tp.add(st.pop());
29+
}
30+
for (int j : tp) {
31+
if (i - j <= d) {
32+
dp[i] = Math.max(dp[i], dp[j] + 1);
33+
}
34+
if (!st.isEmpty() && j - st.peek() <= d) {
35+
dp[st.peek()] = Math.max(dp[st.peek()], dp[j] + 1);
36+
}
37+
}
38+
}
39+
st.push(i);
40+
}
41+
// return *max_element(dp.begin(), dp.end() - 1);
42+
return Arrays.stream(dp).limit(n).max().orElseThrow();
43+
}
44+
}
45+
/*
46+
1340. 跳跃游戏 V
47+
https://leetcode.cn/problems/jump-game-v/description/
48+
49+
给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到:
50+
- i + x ,其中 i + x < arr.length 且 0 < x <= d 。
51+
- i - x ,其中 i - x >= 0 且 0 < x <= d 。
52+
除此以外,你从下标 i 跳到下标 j 需要满足:arr[i] > arr[j] 且 arr[i] > arr[k] ,其中下标 k 是所有 i 到 j 之间的数字(更正式的,min(i, j) < k < max(i, j))。
53+
你可以选择数组的任意下标开始跳跃。请你返回你 最多 可以访问多少个下标。
54+
请注意,任何时刻你都不能跳到数组的外面。
55+
提示:
56+
1 <= arr.length <= 1000
57+
1 <= arr[i] <= 10^5
58+
1 <= d <= arr.length
59+
60+
单调栈 O(n) https://leetcode.cn/problems/jump-game-v/solutions/3059779/dan-diao-zhan-on-by-utopiainbuaa-0k5c/
61+
相似题目: 907. 子数组的最小值之和
62+
https://leetcode.cn/problems/sum-of-subarray-minimums/
63+
*/
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import org.junit.jupiter.api.Assertions;
2+
import org.junit.jupiter.api.Test;
3+
4+
public class Solution1340Tests {
5+
private final Solution1340 solution1340 = new Solution1340();
6+
7+
@Test
8+
public void example1() {
9+
int[] arr = {6, 4, 14, 6, 8, 13, 9, 7, 10, 6, 12};
10+
int d = 2;
11+
int expected = 4;
12+
Assertions.assertEquals(expected, solution1340.maxJumps(arr, d));
13+
}
14+
15+
@Test
16+
public void example2() {
17+
int[] arr = {3, 3, 3, 3, 3};
18+
int d = 3;
19+
int expected = 1;
20+
Assertions.assertEquals(expected, solution1340.maxJumps(arr, d));
21+
}
22+
23+
@Test
24+
public void example3() {
25+
int[] arr = {7, 6, 5, 4, 3, 2, 1};
26+
int d = 1;
27+
int expected = 7;
28+
Assertions.assertEquals(expected, solution1340.maxJumps(arr, d));
29+
}
30+
31+
@Test
32+
public void example4() {
33+
int[] arr = {7, 1, 7, 1, 7, 1};
34+
int d = 2;
35+
int expected = 2;
36+
Assertions.assertEquals(expected, solution1340.maxJumps(arr, d));
37+
}
38+
39+
@Test
40+
public void example5() {
41+
int[] arr = {66};
42+
int d = 1;
43+
int expected = 1;
44+
Assertions.assertEquals(expected, solution1340.maxJumps(arr, d));
45+
}
46+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import java.util.Arrays;
2+
3+
public class Solution1449 {
4+
public String largestNumber(int[] cost, int target) {
5+
int[] f = new int[target + 1];
6+
Arrays.fill(f, Integer.MIN_VALUE);
7+
f[0] = 0;
8+
for (int i = 1; i <= 9; i++) {
9+
int u = cost[i - 1];
10+
for (int j = u; j <= target; j++) {
11+
f[j] = Math.max(f[j], f[j - u] + 1);
12+
}
13+
}
14+
if (f[target] < 0) return "0";
15+
StringBuilder ans = new StringBuilder();
16+
for (int i = 9, j = target; i >= 1; i--) {
17+
int u = cost[i - 1];
18+
while (j >= u && f[j] == f[j - u] + 1) {
19+
ans.append(i);
20+
j -= u;
21+
}
22+
}
23+
return ans.toString();
24+
}
25+
}
26+
/*
27+
1449. 数位成本和为目标值的最大数字
28+
https://leetcode.cn/problems/form-largest-integer-with-digits-that-add-up-to-target/description/
29+
30+
给你一个整数数组 cost 和一个整数 target 。请你返回满足如下规则可以得到的 最大 整数:
31+
- 给当前结果添加一个数位(i + 1)的成本为 cost[i] (cost 数组下标从 0 开始)。
32+
- 总成本必须恰好等于 target 。
33+
- 添加的数位中没有数字 0 。
34+
由于答案可能会很大,请你以字符串形式返回。
35+
如果按照上述要求无法得到任何整数,请你返回 "0" 。
36+
提示:
37+
cost.length == 9
38+
1 <= cost[i] <= 5000
39+
1 <= target <= 5000
40+
41+
问题转换为:有若干物品,求给定费用的前提下,花光所有费用所能选择的最大价值(物品个数)为多少。
42+
https://leetcode.cn/problems/form-largest-integer-with-digits-that-add-up-to-target/solutions/824611/gong-shui-san-xie-fen-liang-bu-kao-lu-we-uy4y/
43+
时间复杂度 O(nt)。
44+
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /