Skip to content

Commit 4cf92ac

Browse files
committed
weekly contest 369
1 parent 5b1084b commit 4cf92ac

File tree

6 files changed

+590
-8
lines changed

6 files changed

+590
-8
lines changed

README.md

+8-7
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ 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-
7+
* 🐼 [weekly contest 369](src/main/java/weekly/wk369.java) 模拟 | 贪心 | dp
8+
* 🐼 [weekly contest 368](src/main/java/weekly/wk368.java) 前后缀 | 前后缀 | 枚举 | 记忆化搜索
99
* 🐼 [weekly contest 365](src/main/java/weekly/wk365.java) 枚举 | 枚举 | 滑动窗口 | 内向基环树
1010
* 🐼 [weekly contest 364](src/main/java/weekly/wk364.java) 贪心 | 单调栈 | 单调栈 | dfs
1111
* 🐼 [weekly contest 363](src/main/java/weekly/wk363.java) 暴力 | 遍历 | 二分 | 质数分解
12-
* 🐼 [weekly contest 362](src/main/java/weekly/wk362.java) 差分数组 | 贪心 | 全排列 |
12+
* 🐼 [weekly contest 362](src/main/java/weekly/wk362.java) 差分数组 | 贪心 | 全排列 |
1313
* 🐼 [weekly contest 361](src/main/java/weekly/wk361.java) 枚举 | 枚举 | 前缀和 | 树上倍增+LCA
1414
* 🐼 [weekly contest 360](src/main/java/weekly/wk360.java) 贪心 | 哈希 | 贪心+二进制 | 树上倍增
1515
* 🐼 [weekly contest 359](src/main/java/weekly/wk359.java) 模拟 | 贪心 | 分组+dp | 分组+双指针
@@ -35,7 +35,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
3535
* 🐎️ [weekly contest 336](src/main/java/weekly/wk336.java) 模拟 | 排序 | 异或前缀和 | 贪心
3636
* 🐎️ [weekly contest 335](src/main/java/weekly/wk335.java) 模拟 | 层序遍历 | 质数分解 | 多重背包
3737
* 🐎️ [weekly contest 334](src/main/java/weekly/wk334.java) 前缀和 | 取模 | 贪心 | Dijkstra
38-
* 🐎️ [weekly contest 333](src/main/java/weekly/wk333.java)
38+
* 🐎️ [weekly contest 333](src/main/java/weekly/wk333.java)
3939
* 🐎️ [weekly contest 332](src/main/java/weekly/wk332.java) 模拟 | 二分 | 哈希 | 前缀和
4040
* 🐎️ [weekly contest 331](src/main/java/weekly/wk331.java) 优先队列 | 前缀和 | 二分 | 贪心
4141
* 🐎️ [weekly contest 328](src/main/java/weekly/wk328.java) 遍历 | 二维差分数组 | 滑动窗口 | 树形DP
@@ -77,7 +77,8 @@ leetcode url: <https://leetcode.cn/u/cctest/>
7777
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
7878
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
7979

80-
80+
* 🐸 [biweekly contest 116](src/main/java/weekly/wkb116.java) 暴力 | 贪心 | dp | 线段树
81+
* 🐸 [biweekly contest 115](src/main/java/weekly/wkb115.java) 模拟 | dp | dp
8182
* 🐸 [biweekly contest 114](src/main/java/weekly/wkb114.java) 哈希 | 贪心 | &运算 | 贪心+dfs
8283
* 🐸 [biweekly contest 113](src/main/java/weekly/wkb113.java) 遍历 | 贪心 | 哈希 | 换根dp
8384
* 🐸 [biweekly contest 112](src/main/java/weekly/wkb112.java) 哈希 | 哈希 | 哈希+滑窗 | 组合数
@@ -92,7 +93,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
9293
* 🐸 [biweekly contest 101](src/main/java/weekly/wkb101.java) 哈希 | 滑动窗口 | 并查集 | BFS
9394
* 🐸 [biweekly contest 100](src/main/java/weekly/wkb100.java) 四维 | 贪心 | 堆 | 二分
9495
* 🐸 [biweekly contest 99](src/main/java/weekly/wkb99.java) 贪心 | 递推 | 区间合并 | 换根DP
95-
* 🐸 [biweekly contest 98](src/main/java/weekly/wkb98.java)
96+
* 🐸 [biweekly contest 98](src/main/java/weekly/wkb98.java)
9697
* 🐸 [biweekly contest 97](src/main/java/weekly/wkb97.java) 模拟 | 哈希 | 滑动窗口 | DFS
9798
* 🐸 [biweekly contest 92](src/main/java/weekly/wkb93.java) 数组 | 排序 | 贪心 | 贪心
9899
* 🐸 [biweekly contest 91](src/main/java/weekly/wkb91.java) 排序 | DP | DFS | 找规律
@@ -109,7 +110,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
109110
* 🐸 [biweekly contest 78](src/main/java/weekly/wkb78.java)
110111
* 🐯 [biweekly contest 77](src/main/java/weekly/wkb77.java)
111112

112-
🐽 🐮 🐗 🐵 🐒 🐴 🐫
113+
🐽 🐮 🐗 🐵 🐒 🐴 🐫
113114

114115

115116

src/main/java/weekly/wk365.java

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ public long maximumTripletValue(int[] nums) {
2929
long ans = 0;
3030
for (int i = 0; i < nums.length; i++) {
3131
ans = Math.max(ans, sub * nums[i]);
32-
3332
sub = Math.max(sub, max - nums[i]);
3433
max = Math.max(max, nums[i]);
3534
}

src/main/java/weekly/wk368.java

+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
10+
public class wk368 {
11+
/* public int minimumSum(int[] nums) {
12+
int ans = Integer.MAX_VALUE;
13+
for (int i = 0; i < nums.length; i++) {
14+
for (int j = i + 1; j < nums.length; j++) {
15+
for (int k = j + 1; k < nums.length; k++) {
16+
if (nums[i] < nums[j] && nums[j] > nums[k]) {
17+
ans = Math.min(nums[i] + nums[j] + nums[k], ans);
18+
}
19+
}
20+
}
21+
}
22+
return ans == Integer.MAX_VALUE ? -1 : ans;
23+
}*/
24+
25+
26+
//前后缀
27+
public int minimumSum(int[] nums) {
28+
int[] minLeft = new int[nums.length + 1];
29+
int[] minRight = new int[nums.length + 1];
30+
31+
minLeft[0] = (int) 1e9 + 7;
32+
minRight[nums.length] = (int) 1e9 + 7;
33+
for (int i = 0; i < nums.length; i++) {
34+
minLeft[i + 1] = Math.min(nums[i], minLeft[i]);
35+
}
36+
37+
for (int i = nums.length - 1; i >= 0; i--) {
38+
minRight[i] = Math.min(nums[i], minRight[i + 1]);
39+
}
40+
41+
int ans = Integer.MAX_VALUE;
42+
for (int i = 1; i < nums.length - 1; i++) {
43+
if (minLeft[i] < nums[i] && minRight[i + 1] < nums[i]) {
44+
ans = Math.min(ans, minLeft[i] + nums[i] + minRight[i + 1]);
45+
}
46+
}
47+
48+
return ans == Integer.MAX_VALUE ? -1 : ans;
49+
}
50+
51+
52+
//找出最小分组
53+
static public int minGroupsForValidAssignment(int[] nums) {
54+
Map<Integer, List<Integer>> map = new HashMap<>();
55+
for (int i = 0; i < nums.length; i++) {
56+
if (!map.containsKey(nums[i])) map.put(nums[i], new ArrayList<>());
57+
map.get(nums[i]).add(i);
58+
}
59+
60+
List<Integer> count = new ArrayList<>();
61+
int min = Integer.MAX_VALUE;
62+
for (Map.Entry<Integer, List<Integer>> entry : map.entrySet()) {
63+
count.add(entry.getValue().size());
64+
min = Math.min(min, entry.getValue().size());
65+
}
66+
int ans = nums.length;
67+
68+
for (int i = 1; i <= min; i++) {
69+
ans = Math.min(ans, check(i, count));
70+
}
71+
72+
return ans;
73+
}
74+
75+
static int check(int min, List<Integer> count) {
76+
int ans = 0;
77+
for (Integer c : count) {
78+
if (c / min < c % min) {
79+
return Integer.MAX_VALUE;
80+
}
81+
//
82+
ans += (c + min) / (min + 1);
83+
}
84+
return ans;
85+
}
86+
87+
88+
//预处理+记忆化搜索好写一点
89+
public int minimumChanges(String s, int k) {
90+
int n = s.length();
91+
int[][] modify = new int[n - 1][n];
92+
for (int left = 0; left < n - 1; left++) {
93+
for (int right = left + 1; right < n; right++) {
94+
modify[left][right] = getModify(s.substring(left, right + 1));
95+
}
96+
}
97+
98+
int[][] memo = new int[k][n];
99+
for (int i = 0; i < k; i++) {
100+
Arrays.fill(memo[i], -1); // -1 表示没有计算过
101+
}
102+
return dfs(k - 1, n - 1, memo, modify);
103+
}
104+
105+
private static final int MX = 201;
106+
private static final List<Integer>[] divisors = new ArrayList[MX];
107+
108+
static {
109+
// 预处理每个数的真因子,时间复杂度 O(MX*logMX)
110+
Arrays.setAll(divisors, k -> new ArrayList<>());
111+
for (int i = 1; i < MX; i++) {
112+
for (int j = i * 2; j < MX; j += i) {
113+
divisors[j].add(i);
114+
}
115+
}
116+
}
117+
118+
private int getModify(String S) {
119+
char[] s = S.toCharArray();
120+
int n = s.length;
121+
int res = n;
122+
for (int d : divisors[n]) {
123+
int cnt = 0;
124+
for (int i0 = 0; i0 < d; i0++) {
125+
for (int i = i0, j = n - d + i0; i < j; i += d, j -= d) {
126+
if (s[i] != s[j]) {
127+
cnt++;
128+
}
129+
}
130+
}
131+
res = Math.min(res, cnt);
132+
}
133+
return res;
134+
}
135+
136+
private int dfs(int i, int j, int[][] memo, int[][] modify) {
137+
if (i == 0) { // 递归边界
138+
return modify[0][j];
139+
}
140+
if (memo[i][j] != -1) { // 之前计算过
141+
return memo[i][j];
142+
}
143+
int res = Integer.MAX_VALUE;
144+
for (int L = i * 2; L < j; L++) {
145+
res = Math.min(res, dfs(i - 1, L - 1, memo, modify) + modify[L][j]);
146+
}
147+
return memo[i][j] = res; // 记忆化
148+
}
149+
150+
151+
public static void main(String[] args) {
152+
minGroupsForValidAssignment(new int[]{
153+
1, 3, 2, 1, 1, 3, 1, 2, 1, 1, 1, 1, 1, 3, 1});
154+
}
155+
}

src/main/java/weekly/wk369.java

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.Map;
5+
6+
public class wk369 {
7+
8+
public int findKOr(int[] nums, int k) {
9+
10+
11+
int res = 0;
12+
13+
for (int i = 0; i < 31; i++) {
14+
int c = 1 << i;
15+
int count = 0;
16+
for (int j = 0; j < nums.length; j++) {
17+
if ((nums[j] & c) == c) {
18+
count++;
19+
}
20+
}
21+
if (count >= k) {
22+
res += c;
23+
}
24+
}
25+
return res;
26+
}
27+
28+
public long minSum(int[] nums1, int[] nums2) {
29+
long sum1 = 0, sum2 = 0;
30+
long zero1 = 0, zero2 = 0;
31+
for (int i : nums1) {
32+
sum1 += i;
33+
if (i == 0) {
34+
zero1++;
35+
}
36+
}
37+
for (int i : nums2) {
38+
sum2 += i;
39+
if (i == 0) {
40+
zero2++;
41+
}
42+
}
43+
if (sum2 > sum1) {
44+
long a = sum1;
45+
sum1 = sum2;
46+
sum2 = a;
47+
a = zero1;
48+
zero1 = zero2;
49+
zero2 = a;
50+
}
51+
52+
//System.out.println(sum1+" "+sum2+" "+zero1+" "+zero2);
53+
long sub = sum1 - sum2;
54+
if (sub == 0) {
55+
if (zero1 == 0 && zero2 == 0) {
56+
return 0;
57+
} else if (zero1 == 0 || zero2 == 0) {
58+
return -1;
59+
} else {
60+
return sum1 + Math.max(zero1, zero2);
61+
}
62+
} else {
63+
64+
if (zero2 == 0) return -1;
65+
if (zero1 == 0) {
66+
if (sub < zero2) {
67+
return -1;
68+
} else {
69+
return sum1;
70+
}
71+
}
72+
return Math.max(sum1 + zero1, sum2 + zero2);
73+
}
74+
}
75+
76+
77+
public long minIncrementOperations(int[] nums, int k) {
78+
long[] dp = new long[3];
79+
for (int i = 0; i < 3; i++) {
80+
dp[i]=Math.max(0,k-nums[i]);
81+
}
82+
83+
for (int i = 3; i < nums.length; i++) {
84+
long up=Math.min(Math.min(dp[0],dp[1]),dp[2])+Math.max(0,k-nums[i]);
85+
dp[0]=dp[1];
86+
dp[1]=dp[2];
87+
dp[2]=up;
88+
}
89+
return Math.min(Math.min(dp[0],dp[1]),dp[2]);
90+
}
91+
92+
static long min(long[] dp) {
93+
long ans = Integer.MAX_VALUE;
94+
for (int i = 0; i < dp.length; i++) {
95+
ans = Math.min(dp[i], ans);
96+
}
97+
return ans;
98+
}
99+
100+
public static void main(String[] args) {
101+
102+
}
103+
104+
}

0 commit comments

Comments
 (0)