Skip to content

Commit ae6a760

Browse files
committed
weekly contest 315
1 parent 14a2e2c commit ae6a760

File tree

3 files changed

+334
-1
lines changed

3 files changed

+334
-1
lines changed

README.md

Lines changed: 3 additions & 1 deletion
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 315](src/main/java/weekly/wk315.java) Hash表 | Hash表 | 暴力 | 双指针
78
* 🐼 [weekly contest 314](src/main/java/weekly/wk312.java) 数组 | 异或运算 | 贪心+栈 | DP
89
* 🐑 [weekly contest 312](src/main/java/weekly/wk312.java) 排序 | 脑筋急转弯 | 前缀和 | 并查集
910
* 🐑 [weekly contest 311](src/main/java/weekly/wk311.java) 规律 | 滑动窗口 | 层序遍历 | 字典树
@@ -31,7 +32,8 @@ leetcode url: <https://leetcode.cn/u/cctest/>
3132
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
3233
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
3334

34-
* 🐘 [biweekly contest 87](src/main/java/weekly/wkb88.java) 模拟 | 指针 | 脑筋急转弯 | 线段树
35+
* 🐸 [biweekly contest 89](src/main/java/weekly/wkb89.java) 判断 | 前缀和 | 贪心、二分 | 枚举+DFS
36+
* 🐘 [biweekly contest 88](src/main/java/weekly/wkb88.java) 模拟 | 指针 | 脑筋急转弯 | 线段树
3537
* 🐘 [biweekly contest 87](src/main/java/weekly/wkb87.java) 模拟 | 双指针 | 位运算 | 贪心
3638
* 🐘 [biweekly contest 86](src/main/java/weekly/wkb86.java) 数组 | 脑筋急转弯 | 位运算 | 滑动窗口+单调队列
3739
* 🐹 [biweekly contest 85](src/main/java/weekly/wkb85.java) 滑动窗口 | 模拟 | 差分数组 | 并查集

src/main/java/weekly/wk315.java

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package weekly;
2+
3+
import org.omg.CORBA.MARSHAL;
4+
5+
import java.util.ArrayList;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Set;
9+
10+
public class wk315 {
11+
//ranking: 1111 / 6490 拉胯啊
12+
13+
//hash
14+
public int findMaxK(int[] nums) {
15+
int ans = -1;
16+
Set<Integer> set = new HashSet<>();
17+
for (int num : nums) {
18+
if (set.contains(-num)) {
19+
ans = Math.max(Math.abs(num), ans);
20+
}
21+
set.add(num);
22+
}
23+
return ans;
24+
}
25+
26+
// hash
27+
public int countDistinctIntegers(int[] nums) {
28+
Set<Integer> set = new HashSet<>();
29+
for (int num : nums) {
30+
set.add(num);
31+
}
32+
for (int num : nums) {
33+
int nnum = 0;
34+
while (num > 0) {
35+
nnum = nnum * 10 + num % 10;
36+
num /= 10;
37+
}
38+
set.add(nnum);
39+
}
40+
return set.size();
41+
}
42+
43+
//暴力,其他解法不会
44+
public boolean sumOfNumberAndReverse(int num) {
45+
for (int i = 0; i <= num; i++) {
46+
int n = i;
47+
int nnum = 0;
48+
while (n > 0) {
49+
nnum = nnum * 10 + n % 10;
50+
n /= 10;
51+
}
52+
if (i + nnum == num) return true;
53+
}
54+
return false;
55+
}
56+
57+
/* public long check(int[] nums, int leftSub, int rightSub, int minK, int maxK) {
58+
List<Integer> minList = new ArrayList<>();
59+
List<Integer> maxList = new ArrayList<>();
60+
for (int i = leftSub; i <= rightSub; i++) {
61+
if (nums[i] == minK) {
62+
minList.add(i);
63+
}
64+
if (nums[i] == maxK) {
65+
maxList.add(i);
66+
}
67+
}
68+
int[] Left = new int[nums.length];
69+
int[] Right = new int[nums.length];
70+
int pre = -1;
71+
// if(nums[0]<minK||nums[0]>maxK)pre=0;
72+
for (int i = 0; i < nums.length; i++) {
73+
74+
if (nums[i] < minK) {
75+
pre = i;
76+
}
77+
if (nums[i] > maxK) {
78+
pre = i;
79+
}
80+
Left[i] = pre;
81+
82+
}
83+
pre = nums.length;
84+
// if(nums[nums.length-1]<minK||nums[nums.length-1]>maxK)pre=nums.length-1;
85+
for (int i = nums.length - 1; i >= 0; i--) {
86+
87+
if (nums[i] < minK) {
88+
pre = i;
89+
}
90+
if (nums[i] > maxK) {
91+
pre = i;
92+
}
93+
Right[i] = pre;
94+
95+
}
96+
97+
98+
long ans = 0;
99+
for (int i = 0; i < minList.size(); i++) {
100+
for (int j = 0; j < maxList.size(); j++) {
101+
int left = Math.min(minList.get(i), maxList.get(j));
102+
int right = Math.max(minList.get(i), maxList.get(j));
103+
if (Right[left] < right || Left[right] > left) continue;
104+
int l = Left[left];
105+
int r = Right[right];
106+
ans += (long) (left - l) * (r - right);
107+
}
108+
}
109+
return ans;
110+
}
111+
112+
public long countSubarrays(int[] nums, int minK, int maxK) {
113+
long left = 0;
114+
long ans = 0;
115+
for (int i = 0; i < nums.length; i++) {
116+
if (nums[i] < minK || nums[i] > maxK) {
117+
118+
}
119+
}
120+
return ans;
121+
}*/
122+
123+
//双指针,要学会拆分子问题
124+
public long countSubarrays(int[] nums, int minK, int maxK) {
125+
long min = -1, max = -1, index = -1, count = 0;
126+
//考虑以i结尾符合条件的定界子数组的个数
127+
for (int i = 0; i < nums.length; i++) {
128+
//更新下界的位置
129+
min = (nums[i] == minK ? i : min);
130+
//更新上界的位置
131+
max = (nums[i] == maxK ? i : max);
132+
//更新不存在上下界的位置
133+
index = (nums[i] < minK || nums[i] > maxK ? i : index);
134+
//以i结尾的符合条件的子数组的个数
135+
count += Math.max(0, Math.min(min,max) - index);
136+
}
137+
return count;
138+
}
139+
}

src/main/java/weekly/wkb89.java

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.LinkedList;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.PriorityQueue;
10+
import java.util.Queue;
11+
12+
public class wkb89 {
13+
//ranking: 484 / 3984
14+
15+
16+
//if判断吧
17+
public int countTime(String time) {
18+
String[] split = time.split(":");
19+
int ans = 1;
20+
if (split[0].charAt(0) == '?' && split[0].charAt(1) == '?') {
21+
ans *= 24;
22+
} else if (split[0].charAt(0) == '?') {
23+
if (split[0].charAt(1) >= '4') {
24+
ans *= 2;
25+
} else {
26+
ans *= 3;
27+
}
28+
} else if (split[0].charAt(1) == '?') {
29+
if (split[0].charAt(0) == '2') {
30+
ans *= 4;
31+
} else {
32+
ans *= 10;
33+
}
34+
}
35+
if (split[1].charAt(0) == '?' && split[1].charAt(1) == '?') {
36+
ans *= 60;
37+
} else if (split[1].charAt(0) == '?') {
38+
ans *= 6;
39+
} else if (split[1].charAt(1) == '?') {
40+
ans *= 10;
41+
42+
}
43+
return ans;
44+
}
45+
46+
47+
//可以前前缀和
48+
public int[] productQueries(int n, int[][] queries) {
49+
List<Integer> list = new ArrayList<>();
50+
for (int i = 0; i < 32; i++) {
51+
if ((n & (1 << i)) > 0) {
52+
list.add(i);
53+
}
54+
}
55+
list.add(0, 0);
56+
for (int i = 1; i < list.size(); i++) {
57+
list.set(i, list.get(i) + list.get(i - 1));
58+
}
59+
60+
int mod = (int) 1e9 + 7;
61+
int[] res = new int[queries.length];
62+
for (int i = 0; i < queries.length; i++) {
63+
//System.out.println(((long) 1) << (list.get(queries[i][1] + 1) - list.get(queries[i][0])));
64+
65+
double a = Math.pow(2, list.get(queries[i][1] + 1) - list.get(queries[i][0])) % mod;
66+
67+
res[i] = (int) a;
68+
}
69+
return res;
70+
}
71+
72+
73+
//贪心,也可以二分
74+
public int minimizeArrayValue(int[] nums) {
75+
long sum = nums[0];
76+
long ans = nums[0];
77+
for (int i = 1; i < nums.length; i++) {
78+
sum += nums[i];
79+
//平摊一下
80+
if (nums[i] > ans) {
81+
long a = sum / (i + 1);
82+
if (a * (i + 1) != sum) {
83+
a += 1;
84+
}
85+
ans = Math.max(a, ans);
86+
}
87+
}
88+
return (int) ans;
89+
}
90+
91+
/* public int componentValue(int[] nums, int[][] edges) {
92+
int sum = 0;
93+
for (int i = 0; i < nums.length; i++) {
94+
sum += nums[i];
95+
}
96+
int left = 1, right = sum;
97+
Map<Integer, List<Integer>> map = new HashMap<>();
98+
int[] count = new int[nums.length];
99+
for (int[] edge : edges) {
100+
if (!map.containsKey(edge[0])) map.put(edge[0], new ArrayList<>());
101+
if (!map.containsKey(edge[1])) map.put(edge[1], new ArrayList<>());
102+
map.get(edge[0]).add(edge[1]);
103+
map.get(edge[1]).add(edge[0]);
104+
count[edge[0]]++;
105+
count[edge[1]]++;
106+
}
107+
Queue<int[]> queue = new LinkedList<>();
108+
for (int i = 0; i < count.length; i++) {
109+
if (count[i] == 1) {
110+
queue.add(new int[]{i, nums[i]});
111+
count[i]--;
112+
}
113+
}
114+
while (left < right) {
115+
int mid = (left + right) / 2;
116+
boolean b = check(nums, map, mid, Arrays.copyOf(count, count.length), new LinkedList<>(queue));
117+
System.out.println(mid + " " + b);
118+
if (b) {
119+
left = mid;
120+
} else {
121+
right = mid - 1;
122+
}
123+
}
124+
return left;
125+
}*/
126+
127+
/* boolean check(int[] nums, Map<Integer, List<Integer>> map, int mid, int[] count, Queue<int[]> queue) {
128+
129+
while (!queue.isEmpty()) {
130+
int[] poll = queue.poll();
131+
int cur = poll[0];
132+
int sum = poll[1];
133+
if (sum > mid) {
134+
return false;
135+
}
136+
if (sum == mid) {
137+
sum = 0;
138+
}
139+
//
140+
for (Integer to : map.getOrDefault(cur, new ArrayList<>())) {
141+
count[to]--;
142+
if (count[to] == 1) {
143+
queue.add(new int[]{to, sum + nums[to]});
144+
} else if (count[to] == 0) {
145+
return sum + nums[to] == mid;
146+
} else {
147+
nums[to] += sum;
148+
}
149+
}
150+
}
151+
return true;
152+
}*/
153+
154+
155+
//枚举+DFS,居然没想到该怎么dfs,反而开始用拓扑排序?
156+
public int componentValue(int[] nums, int[][] edges) {
157+
int sum = 0;
158+
for (int i = 0; i < nums.length; i++) {
159+
sum += nums[i];
160+
}
161+
Map<Integer, List<Integer>> map = new HashMap<>();
162+
for (int[] edge : edges) {
163+
if (!map.containsKey(edge[0])) map.put(edge[0], new ArrayList<>());
164+
if (!map.containsKey(edge[1])) map.put(edge[1], new ArrayList<>());
165+
map.get(edge[0]).add(edge[1]);
166+
map.get(edge[1]).add(edge[0]);
167+
}
168+
169+
//枚举拆分多少个
170+
for (int i = nums.length; i > 0; i--) {
171+
if (sum % i == 0) {
172+
if (dfs(-1, 0, nums, map, sum / i) == 0) return i-1;
173+
}
174+
}
175+
return 1;
176+
}
177+
178+
int dfs(int from, int index, int[] nums, Map<Integer, List<Integer>> map, int sum) {
179+
int result = nums[index];
180+
for (Integer to : map.getOrDefault(index, new ArrayList<>())) {
181+
if (to == from) continue;
182+
int d=dfs(index, to, nums, map, sum);
183+
if(d<0){
184+
return d;
185+
}
186+
result += d;
187+
}
188+
return result > sum ? -1 : result % sum;
189+
}
190+
191+
192+
}

0 commit comments

Comments
 (0)