Skip to content

Commit 3780d3e

Browse files
committed
modify on class
1 parent 8c21178 commit 3780d3e

8 files changed

+209
-110
lines changed

src/topinterviewquestions/Problem_0102_BinaryTreeLevelOrderTraversal.java

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import java.util.ArrayList;
44
import java.util.LinkedList;
55
import java.util.List;
6-
import java.util.Queue;
76

87
public class Problem_0102_BinaryTreeLevelOrderTraversal {
98

@@ -18,28 +17,24 @@ public static List<List<Integer>> levelOrder(TreeNode root) {
1817
if (root == null) {
1918
return ans;
2019
}
21-
ans.add(new ArrayList<Integer>());
22-
Queue<TreeNode> queue = new LinkedList<>();
23-
queue.add(root);
24-
TreeNode curEnd = root; // 当前层,最右节点是谁
25-
TreeNode nextEnd = null; // 下一层,最右节点是谁
26-
while (!queue.isEmpty()) {
27-
TreeNode cur = queue.poll();
28-
ans.get(ans.size() - 1).add(cur.val);
29-
if (cur.left != null) {
30-
queue.add(cur.left);
31-
nextEnd = cur.left;
32-
}
33-
if (cur.right != null) {
34-
queue.add(cur.right);
35-
nextEnd = cur.right;
36-
}
37-
if (cur == curEnd) {
38-
curEnd = nextEnd;
39-
ans.add(new ArrayList<Integer>());
20+
LinkedList<TreeNode> deque = new LinkedList<>();
21+
deque.add(root);
22+
int size = 0;
23+
while(!deque.isEmpty()) {
24+
size = deque.size();
25+
List<Integer> curLevel = new ArrayList<>();
26+
for(int i = 0 ; i< size;i++) {
27+
TreeNode cur = deque.pollLast();
28+
curLevel.add(cur.val);
29+
if(cur.left != null) {
30+
deque.addFirst(cur.left);
31+
}
32+
if(cur.right != null) {
33+
deque.addFirst(cur.right);
34+
}
4035
}
36+
ans.add(curLevel);
4137
}
42-
ans.remove(ans.size() - 1);
4338
return ans;
4439
}
4540

src/topinterviewquestions/Problem_0103_BinaryTreeZigzagLevelOrderTraversal.java

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package topinterviewquestions;
22

33
import java.util.ArrayList;
4+
import java.util.LinkedList;
45
import java.util.List;
5-
import java.util.Stack;
66

77
public class Problem_0103_BinaryTreeZigzagLevelOrderTraversal {
88

@@ -17,35 +17,35 @@ public static List<List<Integer>> zigzagLevelOrder(TreeNode root) {
1717
if (root == null) {
1818
return ans;
1919
}
20-
ans.add(new ArrayList<>());
21-
Stack<TreeNode> LR = new Stack<>();
22-
Stack<TreeNode> RL = new Stack<>();
23-
LR.add(root);
24-
boolean era = true;
25-
while (!LR.isEmpty() || !RL.isEmpty()) {
26-
TreeNode cur = era ? LR.pop() : RL.pop();
27-
ans.get(ans.size() - 1).add(cur.val);
28-
if (era) {
29-
if (cur.left != null) {
30-
RL.push(cur.left);
20+
LinkedList<TreeNode> deque = new LinkedList<>();
21+
deque.add(root);
22+
int size = 0;
23+
boolean isHead = true;
24+
while (!deque.isEmpty()) {
25+
size = deque.size();
26+
List<Integer> curLevel = new ArrayList<>();
27+
for (int i = 0; i < size; i++) {
28+
TreeNode cur = isHead ? deque.pollFirst() : deque.pollLast();
29+
curLevel.add(cur.val);
30+
if(isHead) {
31+
if (cur.left != null) {
32+
deque.addLast(cur.left);
33+
}
34+
if (cur.right != null) {
35+
deque.addLast(cur.right);
36+
}
37+
}else {
38+
if (cur.right != null) {
39+
deque.addFirst(cur.right);
40+
}
41+
if (cur.left != null) {
42+
deque.addFirst(cur.left);
43+
}
3144
}
32-
if (cur.right != null) {
33-
RL.push(cur.right);
34-
}
35-
} else {
36-
if (cur.right != null) {
37-
LR.push(cur.right);
38-
}
39-
if (cur.left != null) {
40-
LR.push(cur.left);
41-
}
42-
}
43-
if (((era && LR.isEmpty()) || (!era && RL.isEmpty()))) {
44-
era = !era;
45-
ans.add(new ArrayList<>());
4645
}
46+
ans.add(curLevel);
47+
isHead = !isHead;
4748
}
48-
ans.remove(ans.size() - 1);
4949
return ans;
5050
}
5151

src/topinterviewquestions/Problem_0104_MaximumDepthOfBinaryTree.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ public static int maxDepth(TreeNode root) {
1515
if (root == null) {
1616
return 0;
1717
}
18-
if (root.left == null && root.right == null) {
19-
return 1;
20-
}
2118
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
2219
}
2320

src/topinterviewquestions/Problem_0105_ConstructBinaryTreeFromPreorderAndInorderTraversal.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,24 @@ public static class TreeNode {
1515
}
1616

1717
public static TreeNode buildTree(int[] preorder, int[] inorder) {
18-
HashMap<Integer, Integer> inMap = new HashMap<>();
18+
HashMap<Integer, Integer> map = new HashMap<>();
1919
for (int i = 0; i < inorder.length; i++) {
20-
inMap.put(inorder[i], i);
20+
map.put(inorder[i], i);
2121
}
22-
return process(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, inMap);
22+
return f(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, map);
2323
}
2424

25-
public static TreeNode process(int[] pre, int L1, int R1, int[] in, int L2, int R2,
26-
HashMap<Integer, Integer> inMap) {
25+
public static TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2, HashMap<Integer, Integer> map) {
2726
if (L1 > R1) {
2827
return null;
2928
}
3029
TreeNode head = new TreeNode(pre[L1]);
3130
if (L1 == R1) {
3231
return head;
3332
}
34-
int find = inMap.get(pre[L1]);
35-
head.left = process(pre, L1 + 1, L1 + find - L2, in, L2, find - 1, inMap);
36-
head.right = process(pre, L1 + find - L2 + 1, R1, in, find + 1, R2, inMap);
33+
int findIndex = map.get(pre[L1]);
34+
head.left = f(pre, L1 + 1, L1 + findIndex - L2, in, L2, findIndex - 1, map);
35+
head.right = f(pre, L1 + findIndex - L2 + 1, R1, in, findIndex + 1, R2, map);
3736
return head;
3837
}
3938

src/topinterviewquestions/Problem_0116_PopulatingNextRightPointersInEachNode.java

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,20 @@ public static class Node {
1212
public static class MyQueue {
1313
public Node head;
1414
public Node tail;
15+
public int size;
1516

1617
public MyQueue() {
1718
head = null;
1819
tail = null;
20+
size = 0;
1921
}
2022

2123
public boolean isEmpty() {
22-
return head == null;
24+
return size == 0;
2325
}
2426

2527
public void offer(Node cur) {
28+
size++;
2629
if (head == null) {
2730
head = cur;
2831
tail = cur;
@@ -33,6 +36,7 @@ public void offer(Node cur) {
3336
}
3437

3538
public Node poll() {
39+
size--;
3640
Node ans = head;
3741
head = head.next;
3842
ans.next = null;
@@ -45,28 +49,24 @@ public static Node connect(Node root) {
4549
if (root == null) {
4650
return root;
4751
}
48-
Node curLevelEnd = root;
49-
Node nextLevelEnd = null;
50-
Node pre = null;
5152
MyQueue queue = new MyQueue();
5253
queue.offer(root);
5354
while (!queue.isEmpty()) {
54-
Node cur = queue.poll();
55-
if (pre != null) {
56-
pre.next = cur;
57-
}
58-
pre = cur;
59-
if (cur.left != null) {
60-
queue.offer(cur.left);
61-
nextLevelEnd = cur.left;
62-
}
63-
if (cur.right != null) {
64-
queue.offer(cur.right);
65-
nextLevelEnd = cur.right;
66-
}
67-
if (cur == curLevelEnd) {
68-
curLevelEnd = nextLevelEnd;
69-
pre = null;
55+
// 第一个弹出的节点
56+
Node pre = null;
57+
int size = queue.size;
58+
for (int i = 0; i < size; i++) {
59+
Node cur = queue.poll();
60+
if (cur.left != null) {
61+
queue.offer(cur.left);
62+
}
63+
if (cur.right != null) {
64+
queue.offer(cur.right);
65+
}
66+
if (pre != null) {
67+
pre.next = cur;
68+
}
69+
pre = cur;
7070
}
7171
}
7272
return root;

src/topinterviewquestions/Problem_0123_BestTimeToBuyAndSellStockIII.java

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,20 @@
33
public class Problem_0123_BestTimeToBuyAndSellStockIII {
44

55
public static int maxProfit(int[] prices) {
6-
if (prices == null || prices.length == 0) {
6+
if (prices == null || prices.length < 2) {
77
return 0;
88
}
9-
return maxProfit(2, prices);
10-
}
11-
12-
// 拓展股票问题
13-
public static int maxProfit(int K, int[] prices) {
14-
if (prices == null || prices.length == 0) {
15-
return 0;
16-
}
17-
int N = prices.length;
18-
if (K >= N / 2) {
19-
return allTrans(prices);
20-
}
21-
// dp一维表
22-
int[] dp = new int[N];
23-
int ans = 0;
24-
for (int tran = 1; tran <= K; tran++) {
25-
int pre = dp[0];
26-
int best = pre - prices[0];
27-
for (int index = 1; index < N; index++) {
28-
pre = dp[index];
29-
dp[index] = Math.max(dp[index - 1], prices[index] + best);
30-
best = Math.max(best, pre - prices[index]);
31-
ans = Math.max(dp[index], ans);
32-
}
33-
}
34-
return ans;
35-
}
36-
37-
public static int allTrans(int[] prices) {
389
int ans = 0;
10+
int doneOnceMinusBuyMax = -prices[0];
11+
int doneOnceMax = 0;
12+
int min = prices[0];
3913
for (int i = 1; i < prices.length; i++) {
40-
ans += Math.max(prices[i] - prices[i - 1], 0);
14+
min = Math.min(min, prices[i]);
15+
ans = Math.max(ans, doneOnceMinusBuyMax + prices[i]);
16+
doneOnceMax = Math.max(doneOnceMax, prices[i] - min);
17+
doneOnceMinusBuyMax = Math.max(doneOnceMinusBuyMax, doneOnceMax - prices[i]);
4118
}
4219
return ans;
4320
}
21+
4422
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package topinterviewquestions;
2+
3+
public class Problem_0188_BestTimeToBuyAndSellStockIV {
4+
5+
public static int maxProfit(int K, int[] prices) {
6+
if (prices == null || prices.length == 0) {
7+
return 0;
8+
}
9+
int N = prices.length;
10+
if (K >= N / 2) {
11+
return allTrans(prices);
12+
}
13+
int[][] dp = new int[K + 1][N];
14+
int ans = 0;
15+
for (int tran = 1; tran <= K; tran++) {
16+
int pre = dp[tran][0];
17+
int best = pre - prices[0];
18+
for (int index = 1; index < N; index++) {
19+
pre = dp[tran - 1][index];
20+
dp[tran][index] = Math.max(dp[tran][index - 1], prices[index] + best);
21+
best = Math.max(best, pre - prices[index]);
22+
ans = Math.max(dp[tran][index], ans);
23+
}
24+
}
25+
return ans;
26+
}
27+
28+
public static int allTrans(int[] prices) {
29+
int ans = 0;
30+
for (int i = 1; i < prices.length; i++) {
31+
ans += Math.max(prices[i] - prices[i - 1], 0);
32+
}
33+
return ans;
34+
}
35+
36+
}

0 commit comments

Comments
 (0)