Skip to content

Commit eefd35b

Browse files
committed
weekly contest 391
1 parent 23914aa commit eefd35b

File tree

3 files changed

+203
-1
lines changed

3 files changed

+203
-1
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
66

77

88

9+
* 🐼 [weekly contest 391](src/main/java/weekly/wk391.java) 遍历 | 模拟 | 滑动窗口 | 数学
910
* 🐼 [weekly contest 390](src/main/java/weekly/wk390.java) 滑动窗口 | 枚举 | 懒删除 | 字典树
1011
* 🐼 [weekly contest 387](src/main/java/weekly/wk387.java) 模拟 | 二维前缀和 | 模拟 | 树状数组
1112
* 🐼 [weekly contest 386](src/main/java/weekly/wk386.java) 遍历 | 贪心 | 二分 | 二分
@@ -93,7 +94,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
9394
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
9495
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
9596

96-
* 🐸 [biweekly contest 126](src/main/java/weekly/wkb126.java) 模拟 | 堆、排序 | 堆、贪心 | DP(背包)
97+
* 🐸 [biweekly contest 127](src/main/java/weekly/wkb127.java) 前缀和 | 滑动窗口 | 记忆化搜索
9798
* 🐸 [biweekly contest 125](src/main/java/weekly/wkb125.java) 遍历 | 堆 | 乘法原理 | 贪心、DP
9899
* 🐸 [biweekly contest 122](src/main/java/weekly/wkb122.java) 滑动窗口+双推 | 分组循环 | 贪心 | 滑动窗口+双堆
99100
* 🐸 [biweekly contest 121](src/main/java/weekly/wkb121.java) 遍历 | 贪心 | 异或 | 数位dp

src/main/java/weekly/wk391.java

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package weekly;
2+
3+
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.Collections;
7+
import java.util.HashMap;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.TreeMap;
11+
12+
public class wk391 {
13+
// 遍历
14+
public int sumOfTheDigitsOfHarshadNumber(int x) {
15+
int num = x;
16+
int ans = 0;
17+
while (x > 0) {
18+
ans += x % 10;
19+
x /= 10;
20+
}
21+
return num % ans == 0 ? ans : -1;
22+
}
23+
24+
//模拟
25+
public int maxBottlesDrunk(int numBottles, int numExchange) {
26+
int ans = numBottles;
27+
while (true) {
28+
if (numBottles >= numExchange) {
29+
numBottles -= numExchange;
30+
ans++;
31+
numBottles += 1;
32+
numExchange++;
33+
} else {
34+
return ans;
35+
}
36+
}
37+
}
38+
39+
//遍历
40+
public long countAlternatingSubarrays(int[] nums) {
41+
42+
long ans = 1;
43+
int left = 0;
44+
for (int i = 1; i < nums.length; i++) {
45+
if (nums[i] == nums[i - 1]) {
46+
left = i;
47+
}
48+
ans += (i - left + 1);
49+
}
50+
return ans;
51+
}
52+
53+
54+
//数学 切比雪夫
55+
public int minimumDistance(int[][] points) {
56+
TreeMap<Integer, Integer> xs = new TreeMap<>();
57+
TreeMap<Integer, Integer> ys = new TreeMap<>();
58+
for (int[] p : points) {
59+
xs.merge(p[0] + p[1], 1, Integer::sum);
60+
ys.merge(p[1] - p[0], 1, Integer::sum);
61+
}
62+
int ans = Integer.MAX_VALUE;
63+
for (int[] p : points) {
64+
int x = p[0] + p[1], y = p[1] - p[0];
65+
if (xs.get(x) == 1) xs.remove(x);
66+
else xs.merge(x, -1, Integer::sum);
67+
if (ys.get(y) == 1) ys.remove(y);
68+
else ys.merge(y, -1, Integer::sum);
69+
ans = Math.min(ans, Math.max(xs.lastKey() - xs.firstKey(), ys.lastKey() - ys.firstKey()));
70+
xs.merge(x, 1, Integer::sum);
71+
ys.merge(y, 1, Integer::sum);
72+
}
73+
return ans;
74+
}
75+
76+
77+
78+
public static void main(String[] args) {
79+
wk391 w = new wk391();
80+
w.minimumDistance(new int[][]{
81+
{3, 10}, {5, 15}, {10, 2}, {4, 4}
82+
});
83+
}
84+
85+
}

src/main/java/weekly/wkb127.java

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
6+
public class wkb127 {
7+
8+
9+
//前缀和
10+
public int minimumLevels(int[] possible) {
11+
int sum = 0;
12+
for (int i = 0; i < possible.length; i++) {
13+
if (possible[i] == 1) {
14+
sum++;
15+
} else {
16+
sum--;
17+
}
18+
}
19+
int left = 0;
20+
for (int i = 0; i < possible.length - 1; i++) {
21+
if (possible[i] == 1) {
22+
left++;
23+
} else {
24+
left--;
25+
}
26+
int right = sum - left;
27+
if (left > right) {
28+
return i + 1;
29+
}
30+
}
31+
return -1;
32+
}
33+
34+
35+
//滑动窗口
36+
static public int minimumSubarrayLength(int[] nums, int k) {
37+
int temp = 0;
38+
int ans = Integer.MAX_VALUE;
39+
40+
int[] count = new int[32];
41+
int left = 0;
42+
for (int i = 0; i < nums.length; i++) {
43+
int num = nums[i];
44+
for (int j = 0; j <= 30; j++) {
45+
if ((num & (1 << j)) > 0) {
46+
count[j]++;
47+
}
48+
}
49+
temp |= nums[i];
50+
while (temp >= k) {
51+
ans = Math.min(ans, i - left + 1);
52+
if (left >= i) break;
53+
num = nums[left];
54+
int delete = 0;
55+
for (int j = 0; j <= 30; j++) {
56+
if ((num & (1 << j)) > 0) {
57+
count[j]--;
58+
if (count[j] == 0) {
59+
delete += (1 << j);
60+
}
61+
}
62+
}
63+
64+
if (temp - delete >= k) {
65+
temp -= delete;
66+
left++;
67+
} else {
68+
for (int j = 0; j <= 30; j++) {
69+
if ((num & (1 << j)) > 0) {
70+
count[j]++;
71+
}
72+
}
73+
break;
74+
}
75+
}
76+
}
77+
78+
return ans == Integer.MAX_VALUE ? -1 : ans;
79+
}
80+
81+
82+
int mod = (int) 1e9 + 7;
83+
84+
int inf = -mod;
85+
86+
//记忆化搜索
87+
public int sumOfPowers(int[] nums, int k) {
88+
89+
Arrays.sort(nums);
90+
memo = new HashMap[nums.length][k];
91+
return dfs(nums, k, inf, 0, 0, Integer.MAX_VALUE);
92+
}
93+
94+
HashMap<String, Integer>[][] memo;
95+
96+
int dfs(int[] nums, int k, int pre, int i, int j, int diff) {
97+
if (j >= k) return diff;
98+
if (i >= nums.length) {
99+
return 0;
100+
}
101+
String key = pre + "_" + diff;
102+
if (memo[i][j] != null && memo[i][j].containsKey(key)) return memo[i][j].get(key);
103+
int res1 = dfs(nums, k, pre, i + 1, j, diff);
104+
int res2 = dfs(nums, k, nums[i], i + 1, j + 1, Math.min(nums[i] - pre, diff));
105+
if (memo[i][j] == null) memo[i][j] = new HashMap<>();
106+
int res = (res1 + res2) % mod;
107+
memo[i][j].put(key, res);
108+
return res;
109+
}
110+
111+
112+
public static void main(String[] args) {
113+
wkb127 w = new wkb127();
114+
w.sumOfPowers(new int[]{1, 2, 3, 4}, 3);
115+
}
116+
}

0 commit comments

Comments
 (0)