Skip to content

Commit ccb9aed

Browse files
committed
weekly contest 392
1 parent eefd35b commit ccb9aed

File tree

2 files changed

+172
-1
lines changed

2 files changed

+172
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Record leetcode contest and ideas every week, and encourage yourself to think mo
55
leetcode url: <https://leetcode.cn/u/cctest/>
66

77

8-
8+
* 🐼 [weekly contest 392](src/main/java/weekly/wk392.java) 遍历 | 贪心 | 排序 | 并查集
99
* 🐼 [weekly contest 391](src/main/java/weekly/wk391.java) 遍历 | 模拟 | 滑动窗口 | 数学
1010
* 🐼 [weekly contest 390](src/main/java/weekly/wk390.java) 滑动窗口 | 枚举 | 懒删除 | 字典树
1111
* 🐼 [weekly contest 387](src/main/java/weekly/wk387.java) 模拟 | 二维前缀和 | 模拟 | 树状数组

src/main/java/weekly/wk392.java

+171
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
public class wk392 {
10+
11+
// 遍历
12+
public int longestMonotonicSubarray(int[] nums) {
13+
int ans = 0;
14+
int temp = 1;
15+
for (int i = 1; i < nums.length; i++) {
16+
if (nums[i] > nums[i - 1]) {
17+
temp++;
18+
} else {
19+
ans = Math.max(temp, ans);
20+
temp = 1;
21+
}
22+
}
23+
ans = Math.max(temp, ans);
24+
temp = 0;
25+
for (int i = 1; i < nums.length; i++) {
26+
if (nums[i] < nums[i - 1]) {
27+
temp++;
28+
} else {
29+
ans = Math.max(temp, ans);
30+
temp = 1;
31+
}
32+
}
33+
ans = Math.max(temp, ans);
34+
temp = 0;
35+
return ans;
36+
}
37+
38+
// 贪心
39+
public String getSmallestString(String s, int k) {
40+
char[] chars = s.toCharArray();
41+
for (int i = 0; i < s.length(); i++) {
42+
int d = distance('a', s.charAt(i));
43+
if (k - d >= 0) {
44+
chars[i] = 'a';
45+
k -= d;
46+
} else {
47+
chars[i] -= k;
48+
break;
49+
}
50+
}
51+
return new String(chars);
52+
}
53+
54+
int distance(char a, char b) {
55+
if (a > b) {
56+
char t = a;
57+
a = b;
58+
b = t;
59+
}
60+
return Math.min(b - a, a + 26 - b);
61+
}
62+
63+
64+
// 排序
65+
public long minOperationsToMakeMedianK(int[] nums, int k) {
66+
Arrays.sort(nums);
67+
int mid = nums.length / 2;
68+
long ans = 0;
69+
for (int i = mid; i < nums.length; i++) {
70+
if (nums[i] < k) {
71+
ans += k - nums[i];
72+
}
73+
}
74+
for (int i = mid; i >= 0; i--) {
75+
if (nums[i] > k) {
76+
ans += nums[i] - k;
77+
}
78+
}
79+
return ans;
80+
}
81+
82+
class UnionFind {
83+
public final int[] parents;
84+
public int count;
85+
86+
public UnionFind(int n) {
87+
this.parents = new int[n];
88+
reset();
89+
}
90+
91+
public void reset() {
92+
for (int i = 0; i < parents.length; i++) {
93+
parents[i] = i;
94+
}
95+
count = parents.length - 1;
96+
}
97+
98+
public int find(int i) {
99+
int parent = parents[i];
100+
if (parent == i) {
101+
return i;
102+
} else {
103+
int root = find(parent);
104+
parents[i] = root;
105+
return root;
106+
}
107+
}
108+
109+
public boolean union(int i, int j) {
110+
int r1 = find(i);
111+
int r2 = find(j);
112+
if (r1 != r2) {
113+
count--;
114+
parents[r1] = r2;
115+
return true;
116+
} else {
117+
return false;
118+
}
119+
}
120+
}
121+
122+
123+
124+
//并查集 &性质
125+
public int[] minimumCost(int n, int[][] edges, int[][] query) {
126+
UnionFind uf = new UnionFind(n + 1);
127+
Map<Integer, List<int[]>> map = new HashMap<>();
128+
for (int i = 0; i < edges.length; i++) {
129+
130+
int a = edges[i][0];
131+
int b = edges[i][1];
132+
int w = edges[i][2];
133+
uf.union(a, b);
134+
if (!map.containsKey(a)) map.put(a, new ArrayList<>());
135+
if (!map.containsKey(b)) map.put(b, new ArrayList<>());
136+
map.get(a).add(new int[]{b, w});
137+
map.get(b).add(new int[]{a, w});
138+
}
139+
Map<Integer, Integer> count = new HashMap<>();
140+
141+
for (int i = 0; i < n; i++) {
142+
int index = uf.find(i);
143+
int t = count.getOrDefault(index, -1);
144+
for (int[] ints : map.getOrDefault(i, new ArrayList<>())) {
145+
if (t == -1) {
146+
t = ints[1];
147+
} else {
148+
t &= ints[1];
149+
}
150+
}
151+
count.put(index, t);
152+
}
153+
154+
155+
int[] ans = new int[query.length];
156+
for (int i = 0; i < query.length; i++) {
157+
if (uf.find(query[i][0]) != uf.find(query[i][1])) {
158+
ans[i] = -1;
159+
} else if (query[i][0] == query[i][1]) {
160+
ans[i] = 0;
161+
162+
} else {
163+
ans[i] = count.get(uf.find(query[i][0]));
164+
165+
}
166+
}
167+
return ans;
168+
}
169+
170+
171+
}

0 commit comments

Comments
 (0)