Skip to content

Commit cde065d

Browse files
committed
weekly contest 328
1 parent 86d6e0e commit cde065d

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

55
leetcode url: <https://leetcode.cn/u/cctest/>
66

7+
* 🐎️ [weekly contest 328](src/main/java/weekly/wk328.java) 变绿 | 二维差分数组 | 滑动窗口 | 树形DP
78
* 🐎️ [weekly contest 327](src/main/java/weekly/wk327.java) 模拟 | 优先队列 | 技术 | 模拟+优先队列
89
* 🐎️ [weekly contest 325](src/main/java/weekly/wk325.java) 数学 | 数学 | 动态规划 | 数学
910
* 🐎️ [weekly contest 324](src/main/java/weekly/wk324.java) 位运算 | 数学 | 图 | 完全二叉树性质

src/main/java/weekly/wk328.java

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
public class wk328 {
9+
//ranking: 400 / 4776
10+
11+
//遍历
12+
public int differenceOfSum(int[] nums) {
13+
int asum = 0, bsum = 0;
14+
15+
for (int num : nums) {
16+
asum += num;
17+
18+
while (num > 0) {
19+
bsum += (num % 10);
20+
num /= 10;
21+
}
22+
}
23+
return Math.abs(asum - bsum);
24+
}
25+
26+
//二维差分数组
27+
public int[][] rangeAddQueries(int n, int[][] queries) {
28+
int[][] res = new int[n][n];
29+
for (int i = 0; i < queries.length; i++) {
30+
int[] q = queries[i];
31+
for (int j = q[0]; j <= q[2]; j++) {
32+
res[j][q[1]] += 1;
33+
if (q[3] + 1 < n) {
34+
res[j][q[3] + 1] -= 1;
35+
}
36+
}
37+
}
38+
39+
for (int i = 0; i < res.length; i++) {
40+
for (int j = 1; j < res[i].length; j++) {
41+
res[i][j] += res[i][j - 1];
42+
}
43+
}
44+
return res;
45+
}
46+
47+
48+
//滑动窗口
49+
public long countGood(int[] nums, int k) {
50+
Map<Integer, Integer> map = new HashMap<>();
51+
int count = 0;
52+
int right = 0;
53+
long res = 0;
54+
for (int i = 0; i < nums.length; i++) {
55+
while (count < k && right < nums.length) {
56+
Integer c = map.getOrDefault(nums[right], 0);
57+
58+
count += c;
59+
map.put(nums[right], c + 1);
60+
right++;
61+
}
62+
if (count >= k) {
63+
res += (nums.length - right + 1);
64+
}
65+
Integer c = map.getOrDefault(nums[i], 0);
66+
if (c > 1) {
67+
count -= (c - 1);
68+
}
69+
map.put(nums[i], c - 1);
70+
}
71+
return res;
72+
}
73+
74+
long sum(long n) {
75+
return n * n / 2;
76+
}
77+
78+
79+
//树形dp
80+
public long maxOutput(int n, int[][] edges, int[] price) {
81+
Map<Integer, List<Integer>> map = new HashMap<>();
82+
for (int[] edge : edges) {
83+
if (!map.containsKey(edge[0])) {
84+
map.put(edge[0], new ArrayList<>());
85+
}
86+
if (!map.containsKey(edge[1])) {
87+
map.put(edge[1], new ArrayList<>());
88+
}
89+
map.get(edge[0]).add(edge[1]);
90+
map.get(edge[1]).add(edge[0]);
91+
}
92+
dfs(map, 0, -1, price);
93+
return res;
94+
}
95+
96+
long res = 0;
97+
98+
long[] dfs(Map<Integer, List<Integer>> map, int index, long up, int[] price) {
99+
//yes表示带叶节点 no表示不带叶节点
100+
//首次初始化相当于没有子树,只有当前节点
101+
long yes = price[index], no = 0;
102+
for (int next : map.getOrDefault(index, new ArrayList<>())) {
103+
if (next == up) {
104+
continue;
105+
}
106+
long[] s = dfs(map, next, index, price);
107+
//max(之前带叶节点的最大值+此次不带叶节点的最大值,
108+
// 之前不带叶节点的最大值+此次带叶节点的最大值)
109+
res = Math.max(res, Math.max(yes + s[1], no + s[0]));
110+
//更新带叶节点最大值
111+
yes = Math.max(yes, s[0] + price[index]);
112+
//更新不带叶节点的最大值
113+
no = Math.max(no, s[1] + price[index]);
114+
}
115+
return new long[]{yes, no};
116+
}
117+
118+
}

0 commit comments

Comments
 (0)