Skip to content

Commit 9a78c10

Browse files
committed
weekly contest 353
1 parent f68f0a5 commit 9a78c10

File tree

5 files changed

+344
-2
lines changed

5 files changed

+344
-2
lines changed

Diff for: README.md

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

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

7-
7+
* ☀️ [weekly contest 353](src/main/java/weekly/wk353.java) 贪心 | dp | dp | 差分数组
8+
* ☀️ [weekly contest 352](src/main/java/weekly/wk352.java) 模拟 | 质数 | 滑动窗口 | 枚举
89
* ☀️ [weekly contest 350](src/main/java/weekly/wk350.java) 模拟 | 排序 | 状态压缩 | dp、记忆化
910
* ☀️ [weekly contest 349](src/main/java/weekly/wk349.java) 模拟 | 贪心 | dp | 堆、单调栈
1011
* ☀️ [weekly contest 348](src/main/java/weekly/wk348.java) 哈希 | 分类讨论 | 逆向 | 数位DP
@@ -63,6 +64,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
6364
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
6465

6566

67+
* 🐸 [biweekly contest 108](src/main/java/weekly/wkb108.java) 模拟 | 哈希 | dp | 枚举
6668
* 🐸 [biweekly contest 107](src/main/java/weekly/wkb107.java) 暴力 | 找规律 | 记忆化搜索、dp | 滑动窗口
6769
* 🐸 [biweekly contest 106](src/main/java/weekly/wkb106.java) 模拟 | 滑动窗口 | 排序统计 | 贪心
6870
* 🐸 [biweekly contest 105](src/main/java/weekly/wkb105.java) 模拟 | 记忆化搜索 | 分类讨论 | 并查集

Diff for: src/main/java/weekly/wk352.java

+133
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashSet;
6+
import java.util.List;
7+
import java.util.Set;
8+
import java.util.TreeMap;
9+
import java.util.TreeSet;
10+
11+
public class wk352 {
12+
13+
//o(n)也可以,因为具有单一性
14+
public int longestAlternatingSubarray(int[] nums, int threshold) {
15+
int ans = 0;
16+
for (int i = 0; i < nums.length; i++) {
17+
if (nums[i] % 2 != 0 || nums[i] > threshold) continue;
18+
int max = 1;
19+
for (int j = i + 1; j < nums.length; j++) {
20+
if (nums[j] % 2 == nums[j - 1] % 2) {
21+
break;
22+
}
23+
if (nums[j] > threshold) {
24+
break;
25+
}
26+
max++;
27+
}
28+
ans = Math.max(ans, max);
29+
}
30+
return ans;
31+
}
32+
33+
public static List<Integer> getPrimes(int n) {
34+
boolean[] isComposite = new boolean[n + 1];
35+
List<Integer> primes = new ArrayList<>();
36+
37+
for (int i = 2; i <= n; i++) {
38+
if (!isComposite[i]) {
39+
primes.add(i);
40+
for (int j = i * 2; j >= 0 && j <= n; j += i) { // 标记该数的倍数为合数
41+
isComposite[j] = true;
42+
}
43+
}
44+
}
45+
return primes;
46+
}
47+
48+
static Set<Integer> set = new HashSet<>();
49+
50+
static {
51+
52+
for (Integer prime : getPrimes(1000001)) {
53+
set.add(prime);
54+
}
55+
}
56+
57+
//先static求出所有质数
58+
public List<List<Integer>> findPrimePairs(int n) {
59+
List<List<Integer>> res = new ArrayList<>();
60+
for (int i = 2; i <= n / 2; i++) {
61+
if (set.contains(i) && set.contains(n - i)) {
62+
res.add(Arrays.asList(i, n - i));
63+
}
64+
}
65+
return res;
66+
}
67+
68+
69+
//滑动窗口,treemap存值方便找最大最小值
70+
static public long continuousSubarrays(int[] nums) {
71+
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
72+
int left = 0;
73+
long ans = 0;
74+
for (int i = 0; i < nums.length; i++) {
75+
treeMap.put(nums[i], treeMap.getOrDefault(nums[i], 0) + 1);
76+
while (Math.abs(treeMap.firstKey() - treeMap.lastKey()) > 2) {
77+
Integer count = treeMap.get(nums[left]);
78+
if (count == 1) {
79+
treeMap.remove(nums[left]);
80+
} else {
81+
treeMap.put(nums[left], count - 1);
82+
}
83+
left++;
84+
}
85+
long c = (i - left + 1);
86+
ans += c;
87+
}
88+
return ans;
89+
}
90+
91+
public static void main(String[] args) {
92+
continuousSubarrays(new int[]{5, 4, 2, 4});
93+
}
94+
95+
96+
97+
// 枚举
98+
public int sumImbalanceNumbers(int[] nums) {
99+
int ans = 0;
100+
for (int i = 0; i < nums.length; i++) {
101+
int count = 0;
102+
TreeSet<Integer> treeSet = new TreeSet<>();
103+
treeSet.add(nums[i]);
104+
for (int j = i + 1; j < nums.length; j++) {
105+
if (treeSet.contains(nums[j])) {
106+
ans += count;
107+
continue;
108+
}
109+
Integer left = treeSet.lower(nums[j]);
110+
Integer right = treeSet.higher(nums[j]);
111+
if (left != null && right != null) {
112+
if (nums[j] - left > 1 && right - nums[j] > 1) {
113+
count++;
114+
} else if (nums[j] - left <= 1 && right - nums[j] <= 1) {
115+
count--;
116+
}
117+
} else if (left == null) {
118+
if (right - nums[j] > 1) {
119+
count++;
120+
}
121+
} else if (right == null) {
122+
if (nums[j] - left > 1) {
123+
count++;
124+
}
125+
}
126+
treeSet.add(nums[j]);
127+
ans += count;
128+
129+
}
130+
}
131+
return ans;
132+
}
133+
}

Diff for: src/main/java/weekly/wk353.java

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
public class wk353 {
8+
9+
//贪心
10+
public int theMaximumAchievableX(int num, int t) {
11+
return num + t * 2;
12+
}
13+
14+
//dp
15+
public int maximumJumps(int[] nums, int target) {
16+
int[] dp = new int[nums.length];
17+
Arrays.fill(dp, -1);
18+
dp[0] = 0;
19+
for (int i = 1; i < nums.length; i++) {
20+
for (int j = 0; j < i; j++) {
21+
if (nums[i] - nums[j] >= -target && nums[i] - nums[j] <= target && dp[j] != -1) {
22+
dp[i] = Math.max(dp[i], dp[j] + 1);
23+
}
24+
}
25+
}
26+
return dp[nums.length - 1];
27+
}
28+
29+
30+
//dp
31+
public int maxNonDecreasingLength(int[] nums1, int[] nums2) {
32+
int ans = 1;
33+
int[][] dp = new int[nums1.length][2];
34+
dp[0][0] = 1;
35+
dp[0][1] = 1;
36+
for (int i = 1; i < nums1.length; i++) {
37+
dp[i][0] = 1;
38+
dp[i][1] = 1;
39+
if (nums1[i] >= nums1[i - 1]) {
40+
dp[i][0] = Math.max(dp[i - 1][0] + 1, dp[i][0]);
41+
}
42+
if (nums1[i] >= nums2[i - 1]) {
43+
dp[i][0] = Math.max(dp[i - 1][1] + 1, dp[i][0]);
44+
}
45+
if (nums2[i] >= nums1[i - 1]) {
46+
dp[i][1] = Math.max(dp[i - 1][0] + 1, dp[i][1]);
47+
}
48+
if (nums2[i] >= nums2[i - 1]) {
49+
dp[i][1] = Math.max(dp[i - 1][1] + 1, dp[i][1]);
50+
}
51+
ans = Math.max(ans, dp[i][0]);
52+
ans = Math.max(ans, dp[i][1]);
53+
}
54+
return ans;
55+
56+
}
57+
58+
59+
//滑动窗口 本质是差分数组
60+
static public boolean checkArray(int[] nums, int k) {
61+
62+
if(k==1) return true;
63+
int sum = nums[0];
64+
for (int i = 1; i < nums.length; i++) {
65+
int left = i - k ;
66+
//减去左边的贡献
67+
if (left >= 0) {
68+
sum -= nums[left];
69+
}
70+
//需要减去更多,此处已经不满足
71+
if (sum > nums[i]) {
72+
return false;
73+
}
74+
//i处需要添加的贡献
75+
nums[i] = (nums[i] - sum);
76+
sum+=nums[i];
77+
}
78+
return nums[nums.length-1]==0;
79+
}
80+
81+
public static void main(String[] args) {
82+
checkArray(new int[]{2,2,3,2,1},3);
83+
}
84+
}

Diff for: src/main/java/weekly/wkb105.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public static List<Integer> getPrimes(int n) {
148148
for (int i = 2; i <= n; i++) {
149149
if (!isComposite[i]) {
150150
primes.add(i);
151-
for (int j = i * i; j >= 0 && j <= n; j += i) { // 标记该数的倍数为合数
151+
for (int j = i * 2; j >= 0 && j <= n; j += i) { // 标记该数的倍数为合数
152152
isComposite[j] = true;
153153
}
154154
}

Diff for: src/main/java/weekly/wkb108.java

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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+
import java.util.TreeSet;
11+
12+
public class wkb108 {
13+
14+
15+
//模拟
16+
public int alternatingSubarray(int[] nums) {
17+
int ans = 0;
18+
for (int i = 0; i < nums.length; i++) {
19+
int flag = 1;
20+
int j = i + 1;
21+
for (; j < nums.length; j++) {
22+
if (nums[j] - nums[j - 1] != flag) {
23+
break;
24+
}
25+
flag *= -1;
26+
}
27+
ans = Math.max(ans, j - i);
28+
}
29+
return ans == 1 ? -1 : ans;
30+
}
31+
32+
33+
//哈希
34+
public List<Integer> relocateMarbles(int[] nums, int[] moveFrom, int[] moveTo) {
35+
Set<Integer> set = new TreeSet<>();
36+
for (int i = 0; i < nums.length; i++) {
37+
set.add(nums[i]);
38+
}
39+
40+
for (int i = 0; i < moveFrom.length; i++) {
41+
set.remove(moveFrom[i]);
42+
set.add(moveTo[i]);
43+
}
44+
45+
List<Integer> res = new ArrayList<>(set);
46+
return res;
47+
}
48+
49+
50+
//dp
51+
public int minimumBeautifulSubstrings(String s) {
52+
int[] dp = new int[s.length() + 1];
53+
Arrays.fill(dp, (int) 1e9 + 7);
54+
dp[0] = 0;
55+
Set<String> set = new HashSet<>();
56+
int ans = 1;
57+
//先求出5的幂的2进制字符串
58+
for (int i = 0; i < 12; i++) {
59+
set.add(Integer.toBinaryString(ans));
60+
ans *= 5;
61+
}
62+
63+
//dp枚举
64+
for (int i = 0; i < s.length(); i++) {
65+
for (int start = 0; start <= i; start++) {
66+
String sub = s.substring(start, i + 1);
67+
if (sub.startsWith("0")) continue;
68+
if (!set.contains(sub)) continue;
69+
dp[i + 1] = Math.min(dp[start] + 1, dp[i + 1]);
70+
}
71+
}
72+
return dp[s.length()] == (int) 1e7 ? -1 : dp[s.length()];
73+
}
74+
75+
76+
//枚举黑格子,每个格子只对四个有贡献,一次求对他们的贡献
77+
public long[] countBlackBlocks(int m, int n, int[][] coordinates) {
78+
Map<Long, Integer> map = new HashMap<>();
79+
for (int[] coordinate : coordinates) {
80+
//左上角
81+
int x = coordinate[0] - 1, y = coordinate[1] - 1;
82+
if (x >= 0 && y >= 0 && x < m && y < n) {
83+
long ans = (long) x * n + y;
84+
map.put(ans, map.getOrDefault(ans, 0) + 1);
85+
}
86+
//右上角
87+
x = coordinate[0] - 1;
88+
y = coordinate[1] + 1;
89+
if (x >= 0 && y >= 0 && x < m && y < n) {
90+
long ans = (long) x * n + y - 1;
91+
map.put(ans, map.getOrDefault(ans, 0) + 1);
92+
}
93+
//左下角
94+
x = coordinate[0] + 1;
95+
y = coordinate[1] - 1;
96+
if (x >= 0 && y >= 0 && x < m && y < n) {
97+
long ans = (long) (x - 1) * n + y;
98+
map.put(ans, map.getOrDefault(ans, 0) + 1);
99+
100+
}
101+
//右下角
102+
x = coordinate[0] + 1;
103+
y = coordinate[1] + 1;
104+
if (x >= 0 && y >= 0 && x < m && y < n) {
105+
long ans = (long) (x - 1) * n + y - 1;
106+
map.put(ans, map.getOrDefault(ans, 0) + 1);
107+
}
108+
}
109+
long[] res = new long[5];
110+
long c = 0;
111+
for (int value : map.values()) {
112+
res[value]++;
113+
c++;
114+
}
115+
res[0] = (long) (m - 1) * (n - 1) - c;
116+
return res;
117+
}
118+
119+
120+
public static void main(String[] args) {
121+
122+
}
123+
}

0 commit comments

Comments
 (0)