Skip to content

Commit 5b1084b

Browse files
committed
weekly contest 365
1 parent 0ae4c47 commit 5b1084b

File tree

3 files changed

+241
-0
lines changed

3 files changed

+241
-0
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
44

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

7+
8+
9+
* 🐼 [weekly contest 365](src/main/java/weekly/wk365.java) 枚举 | 枚举 | 滑动窗口 | 内向基环树
710
* 🐼 [weekly contest 364](src/main/java/weekly/wk364.java) 贪心 | 单调栈 | 单调栈 | dfs
811
* 🐼 [weekly contest 363](src/main/java/weekly/wk363.java) 暴力 | 遍历 | 二分 | 质数分解
912
* 🐼 [weekly contest 362](src/main/java/weekly/wk362.java) 差分数组 | 贪心 | 全排列 |
@@ -74,6 +77,8 @@ leetcode url: <https://leetcode.cn/u/cctest/>
7477
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
7578
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
7679

80+
81+
* 🐸 [biweekly contest 114](src/main/java/weekly/wkb114.java) 哈希 | 贪心 | &运算 | 贪心+dfs
7782
* 🐸 [biweekly contest 113](src/main/java/weekly/wkb113.java) 遍历 | 贪心 | 哈希 | 换根dp
7883
* 🐸 [biweekly contest 112](src/main/java/weekly/wkb112.java) 哈希 | 哈希 | 哈希+滑窗 | 组合数
7984
* 🐸 [biweekly contest 111](src/main/java/weekly/wkb111.java) 遍历 | 贪心+双指针 | 前缀和、dp | 数位dp

src/main/java/weekly/wk365.java

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
public class wk365 {
12+
/* public long maximumTripletValue(int[] nums) {
13+
long max = 0;
14+
for (int i = 0; i < nums.length; i++) {
15+
for (int j = i + 1; j < nums.length; j++) {
16+
for (int k = j + 1; k < nums.length; k++) {
17+
max = Math.max(max, ((long) nums[i] - nums[j]) * nums[k]);
18+
}
19+
}
20+
}
21+
return max;
22+
}*/
23+
24+
25+
//枚举
26+
public long maximumTripletValue(int[] nums) {
27+
long max = 0;
28+
long sub = 0;
29+
long ans = 0;
30+
for (int i = 0; i < nums.length; i++) {
31+
ans = Math.max(ans, sub * nums[i]);
32+
33+
sub = Math.max(sub, max - nums[i]);
34+
max = Math.max(max, nums[i]);
35+
}
36+
return ans;
37+
}
38+
39+
40+
//滑动窗口+分类
41+
public int minSizeSubarray(int[] nums, int target) {
42+
long total = 0;
43+
for (int x : nums) total += x;
44+
int n = nums.length;
45+
int ans = Integer.MAX_VALUE;
46+
int left = 0;
47+
long sum = 0;
48+
for (int right = 0; right < n * 2; right++) {
49+
sum += nums[right % n];
50+
while (sum > target % total) {
51+
sum -= nums[left++ % n];
52+
}
53+
if (sum == target % total) {
54+
ans = Math.min(ans, right - left + 1);
55+
}
56+
}
57+
return ans == Integer.MAX_VALUE ? -1 : ans + (int) (target / total) * n;
58+
}
59+
60+
61+
//内向基环树
62+
static public int[] countVisitedNodes(List<Integer> edges) {
63+
64+
65+
int[] ans = new int[edges.size()];
66+
int[] in = new int[edges.size()];
67+
for (Integer edge : edges) {
68+
in[edge]++;
69+
}
70+
71+
for (int i = 0; i < edges.size(); i++) {
72+
73+
int cur = i;
74+
if (ans[cur] != 0) continue;
75+
int time = 0;
76+
Map<Integer, Integer> set = new HashMap<>();
77+
List<Integer> list = new ArrayList<>();
78+
set.put(cur, time);
79+
list.add(cur);
80+
81+
while (true) {
82+
time++;
83+
cur = edges.get(cur);
84+
//之前计算过了
85+
if (ans[cur] != 0) {
86+
for (int j = 0; j < list.size(); j++) {
87+
ans[list.get(j)] = ans[cur] + list.size() - j;
88+
}
89+
break;
90+
}
91+
//存在圈
92+
if (set.containsKey(cur)) {
93+
int circleIn = set.get(cur);
94+
int circle = time - circleIn;
95+
for (int j = 0; j < list.size(); j++) {
96+
//在圈之前
97+
if (j < circleIn) {
98+
ans[list.get(j)] = circle + circleIn - j;
99+
//在圈里
100+
} else {
101+
ans[list.get(j)] = circle;
102+
}
103+
}
104+
break;
105+
}
106+
set.put(cur, time);
107+
list.add(cur);
108+
109+
}
110+
111+
112+
}
113+
114+
return ans;
115+
}
116+
117+
118+
public static void main(String[] args) {
119+
countVisitedNodes(Arrays.asList(1,2,0,0));
120+
}
121+
}

src/main/java/weekly/wkb114.java

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package weekly;
2+
3+
import java.net.Inet4Address;
4+
import java.util.ArrayList;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Set;
10+
11+
public class wkb114 {
12+
13+
14+
// hash
15+
public int minOperations(List<Integer> nums, int k) {
16+
Set<Integer> set = new HashSet<>();
17+
for (int i = 1; i <= k; i++) {
18+
set.add(i);
19+
}
20+
int ans = 0;
21+
for (int size = nums.size() - 1; size >= 0; size--) {
22+
set.remove(nums.get(size));
23+
ans++;
24+
if (set.size() == 0) return ans;
25+
}
26+
return ans;
27+
}
28+
29+
//贪心
30+
public int minOperations(int[] nums) {
31+
Map<Integer, Integer> map = new HashMap<>();
32+
for (int i = 0; i < nums.length; i++) {
33+
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
34+
}
35+
int ans = 0;
36+
for (Integer value : map.values()) {
37+
if (value == 1) {
38+
return -1;
39+
}
40+
if (value % 3 == 0) {
41+
ans += value / 3;
42+
} else if (value % 3 == 1) {
43+
ans += (value - 1) / 3 + 1;
44+
} else {
45+
ans += value / 3 + 1;
46+
}
47+
}
48+
return ans;
49+
}
50+
51+
52+
// &运算性质
53+
static public int maxSubarrays(int[] nums) {
54+
int sum = nums[0];
55+
for (int i = 1; i < nums.length; i++) {
56+
sum &= nums[i];
57+
}
58+
int ans = 0;
59+
60+
//&和为0的时候特殊计算
61+
if (sum == 0) {
62+
int pre = nums[0];
63+
for (int i = 1; i < nums.length; i++) {
64+
if (pre == sum) {
65+
ans++;
66+
pre = nums[i];
67+
} else {
68+
pre &= nums[i];
69+
}
70+
}
71+
if (pre == sum) {
72+
ans++;
73+
}
74+
} else {
75+
ans = 1;
76+
}
77+
78+
79+
return ans;
80+
}
81+
82+
83+
//贪心
84+
public int maxKDivisibleComponents(int n, int[][] edges, int[] values, int k) {
85+
Map<Integer, List<Integer>> map = new HashMap<>();
86+
for (int[] edge : edges) {
87+
if (!map.containsKey(edge[0])) {
88+
map.put(edge[0], new ArrayList<>());
89+
}
90+
if (!map.containsKey(edge[1])) {
91+
map.put(edge[1], new ArrayList<>());
92+
}
93+
map.get(edge[0]).add(edge[1]);
94+
map.get(edge[1]).add(edge[0]);
95+
}
96+
return (int) dfs(-1, 0, map, values, k)[0];
97+
}
98+
99+
long[] dfs(int parent, int cur, Map<Integer, List<Integer>> map, int[] values, int k) {
100+
101+
long val = values[cur];
102+
long ans = 0;
103+
for (Integer child : map.getOrDefault(cur, new ArrayList<>())) {
104+
if (child == parent) continue;
105+
long[] ints = dfs(cur, child, map, values, k);
106+
ans += ints[0];
107+
val += ints[1];
108+
}
109+
if (val % k == 0) {
110+
ans += 1;
111+
}
112+
113+
return new long[]{ans, val};
114+
}
115+
}

0 commit comments

Comments
 (0)