Skip to content

Commit db06e86

Browse files
committed
weekly contest 307
1 parent d060a13 commit db06e86

File tree

3 files changed

+381
-0
lines changed

3 files changed

+381
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
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 307](src/main/java/weekly/wk307.java) 贪心 | 贪心 | 图 | 堆
78
* 🐻 [weekly contest 306](src/main/java/weekly/wk306.java) 数组 | 有向图图 | 贪心、栈 | 数位DP
89
* 🐨 [weekly contest 305](src/main/java/weekly/wk305.java) Array | Array | DP | DP
910
* 🐍 [weekly contest 304](src/main/java/weekly/wk304.java) Array | Array Greedy | Graph | Graph Topological Sort
@@ -23,6 +24,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
2324
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
2425
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
2526

27+
* 🐹 [biweekly contest 85](src/main/java/weekly/wkb85.java) 滑动窗口 | 模拟 | 差分数组 | 并查集
2628
* 🐹 [biweekly contest 82](src/main/java/weekly/wkb82.java) DFS | Greedy | Greedy| Monotonic Stack/Union Find
2729
* 🐹 [biweekly contest 81](src/main/java/weekly/wkb81.java)
2830
* 🐰 [biweekly contest 80](src/main/java/weekly/wkb80.java)

src/main/java/weekly/wk307.java

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
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.LinkedList;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.PriorityQueue;
11+
import java.util.Queue;
12+
import java.util.Set;
13+
14+
public class wk307 {
15+
16+
//ranking: 659 / 7064
17+
18+
19+
//简单题,注意比赛顺序是从后往前的..
20+
public int minNumberOfHours(int initialEnergy, int initialExperience, int[] energy, int[] experience) {
21+
22+
int ans = 0;
23+
for (int i = 0; i < energy.length; i++) {
24+
if (energy[i] >= initialEnergy) {
25+
//严格大于
26+
ans += energy[i] - initialEnergy + 1;
27+
initialEnergy += energy[i] - initialEnergy + 1;
28+
}
29+
//精力扣除
30+
initialEnergy -= energy[i];
31+
32+
if (experience[i] >= initialExperience) {
33+
//严格大于
34+
ans += experience[i] - initialExperience + 1;
35+
initialExperience += experience[i] - initialExperience + 1;
36+
}
37+
//经验上涨
38+
initialExperience += experience[i];
39+
}
40+
return ans;
41+
}
42+
43+
44+
//中等题,注意边界条件,只需计算前半部分即可
45+
public String largestPalindromic(String num) {
46+
int[] count = new int[10];
47+
for (char c : num.toCharArray()) {
48+
count[c - '0']++;
49+
}
50+
StringBuilder sb = new StringBuilder();
51+
for (int i = count.length - 1; i >= 0; i--) {
52+
while (count[i] >= 2) {
53+
sb.append(i);
54+
count[i] -= 2;
55+
}
56+
}
57+
boolean add = false;
58+
int c = -1;
59+
for (int i = count.length - 1; i >= 0; i--) {
60+
if (count[i] > 0) {
61+
add = true;
62+
c = i;
63+
break;
64+
}
65+
}
66+
//
67+
while (sb.length() > 0 && sb.charAt(0) == '0') {
68+
sb.delete(0, 1);
69+
}
70+
//没有单独的>0的数字
71+
if (c <= 0 && sb.length() == 0) return "0";
72+
StringBuilder reverse = new StringBuilder(sb).reverse();
73+
if (!add) {
74+
return sb.append(reverse).toString();
75+
} else {
76+
return sb.append(c).append(reverse).toString();
77+
}
78+
}
79+
80+
public class TreeNode {
81+
int val;
82+
TreeNode left;
83+
TreeNode right;
84+
85+
TreeNode() {
86+
}
87+
88+
TreeNode(int val) {
89+
this.val = val;
90+
}
91+
92+
TreeNode(int val, TreeNode left, TreeNode right) {
93+
this.val = val;
94+
this.left = left;
95+
this.right = right;
96+
}
97+
}
98+
99+
//中等题,先计算图,然后bfs
100+
public int amountOfTime(TreeNode root, int start) {
101+
Map<Integer, List<Integer>> map = new HashMap<>();
102+
help(root, map, -1);
103+
Queue<Integer> queue = new LinkedList<>();
104+
queue.add(start);
105+
Set<Integer> set = new HashSet<>();
106+
int time = 0;
107+
set.add(start);
108+
while (!queue.isEmpty()) {
109+
int size = queue.size();
110+
while (size-- > 0) {
111+
Integer poll = queue.poll();
112+
if (!map.containsKey(poll)) continue;
113+
for (Integer next : map.get(poll)) {
114+
if (set.contains(next)) continue;
115+
set.add(next);
116+
queue.add(next);
117+
}
118+
}
119+
time++;
120+
}
121+
return time - 1;
122+
}
123+
124+
void help(TreeNode root, Map<Integer, List<Integer>> map, int up) {
125+
126+
if (!map.containsKey(root)) {
127+
map.put(root.val, new ArrayList<>());
128+
}
129+
if (up != -1) {
130+
map.get(root.val).add(up);
131+
}
132+
if (root.left != null) {
133+
map.get(root.val).add(root.left.val);
134+
help(root.left, map, root.val);
135+
}
136+
if (root.right != null) {
137+
map.get(root.val).add(root.right.val);
138+
help(root.right, map, root.val);
139+
}
140+
}
141+
142+
class Pair {
143+
long sum = 0;
144+
int index = 0;
145+
146+
Pair(long sum, int index) {
147+
this.sum = sum;
148+
this.index = index;
149+
}
150+
}
151+
152+
153+
//困难题,当时没想出来,看了题解恍然大悟
154+
public long kSum(int[] nums, int k) {
155+
156+
//最大的数一定是所有正数的和
157+
long sum = 0;
158+
for (int i = 0; i < nums.length; i++) {
159+
if (nums[i] > 0) {
160+
sum += nums[i];
161+
} else {
162+
//变成正数,一律按减法处理
163+
nums[i] =-nums[i];
164+
}
165+
}
166+
if (k == 1) return sum;
167+
Arrays.sort(nums);
168+
169+
PriorityQueue<Pair> priorityQueue = new PriorityQueue<>((a, b) -> (int) (b.sum - a.sum));
170+
priorityQueue.add(new Pair(sum - nums[0], 0));
171+
//依次对每个位置取或者不取
172+
for(int i=2;i<k;i++){
173+
Pair poll = priorityQueue.poll();
174+
//System.out.println(poll.sum);
175+
if (poll.index < nums.length-1) {
176+
priorityQueue.add(new Pair(poll.sum - nums[poll.index + 1], poll.index + 1));
177+
priorityQueue.add(new Pair(poll.sum + nums[poll.index]- nums[poll.index + 1], poll.index + 1));
178+
}
179+
}
180+
return priorityQueue.poll().sum;
181+
}
182+
183+
public static void main(String[] args) {
184+
185+
}
186+
}

src/main/java/weekly/wkb85.java

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
package weekly;
2+
3+
import java.util.TreeMap;
4+
5+
public class wkb85 {
6+
7+
//ranking: 228 / 4193
8+
9+
//简单题,暴力
10+
/* public int minimumRecolors(String blocks, int k) {
11+
int ans = Integer.MAX_VALUE;
12+
for (int i = 0; i + k <= blocks.length(); i++) {
13+
int count = 0;
14+
for (int j = i; j < i + k; j++) {
15+
char c = blocks.charAt(j);
16+
if (c == 'W') {
17+
count++;
18+
}
19+
}
20+
ans = Math.min(count, ans);
21+
}
22+
return ans;
23+
}*/
24+
25+
//简单题,滑动窗口
26+
public int minimumRecolors(String blocks, int k) {
27+
int ans = Integer.MAX_VALUE;
28+
int count = 0;
29+
for (int i = 0; i < k-1; i++) {
30+
if(blocks.charAt(i)=='W'){
31+
count++;
32+
}
33+
}
34+
for(int i=k-1;i<blocks.length();i++){
35+
if(blocks.charAt(i)=='W'){
36+
count++;
37+
}
38+
ans=Math.min(ans,count);
39+
if(blocks.charAt(i-k+1)=='W'){
40+
count--;
41+
}
42+
}
43+
return ans;
44+
}
45+
46+
//中等题,暴力
47+
/* public int secondsToRemoveOccurrences(String s) {
48+
char[] chars = s.toCharArray();
49+
int ans = 0;
50+
while (true) {
51+
boolean change = false;
52+
for (int i = 1; i < s.length(); i++) {
53+
if (chars[i - 1] == '0' && chars[i] == '1') {
54+
chars[i - 1] = '1';
55+
chars[i] = '0';
56+
change = true;
57+
i++;
58+
}
59+
}
60+
if (change) ans++;
61+
else return ans;
62+
}
63+
}*/
64+
65+
public int secondsToRemoveOccurrences(String s) {
66+
int res=0;
67+
int count=0;
68+
for (char c : s.toCharArray()) {
69+
if(c=='0'){
70+
count++;
71+
}else if(count>0){
72+
res=Math.max(res+1,count);
73+
}
74+
}
75+
return res;
76+
}
77+
78+
public String shiftingLetters(String s, int[][] shifts) {
79+
char[] chars = s.toCharArray();
80+
//差分数组统计移动的位数
81+
int[] count = new int[s.length() + 1];
82+
for (int i = 0; i < shifts.length; i++) {
83+
int left = shifts[i][0];
84+
int right = shifts[i][1];
85+
int u = shifts[i][2];
86+
if (u == 0) {
87+
count[left] -= 1;
88+
count[right + 1] += 1;
89+
} else {
90+
count[left] += 1;
91+
count[right + 1] -= 1;
92+
}
93+
}
94+
int cur = 0;
95+
for (int i = 0; i < chars.length; i++) {
96+
cur += count[i];
97+
//System.out.println(chars[i] + " " + cur);
98+
//去除多余的循环
99+
chars[i] += (cur % 26);
100+
//+26或-26
101+
if (chars[i] < 'a') {
102+
chars[i] += 26;
103+
} else if (chars[i] > 'z') {
104+
chars[i] -= 26;
105+
}
106+
}
107+
return new String(chars);
108+
}
109+
110+
111+
//困难题,倒着思考,然后并查集合并区间
112+
public long[] maximumSegmentSum(int[] nums, int[] removeQueries) {
113+
long[] res = new long[nums.length];
114+
long max = 0;
115+
long[] sum = new long[nums.length];//用来存以i为uf key的子数组和
116+
UnionFind uf = new UnionFind(nums.length);
117+
for (int i = nums.length - 1; i >= 0; i--) {
118+
res[i] = max;
119+
int index = removeQueries[i];
120+
int num = nums[index];
121+
sum[index] = num;
122+
max = Math.max(max, sum[index]);
123+
//左边可以合并
124+
if (index - 1 >= 0 && sum[index - 1] > 0) {
125+
long s = sum[uf.find(index - 1)] + sum[uf.find(index)];
126+
uf.union(index - 1, index);
127+
sum[uf.find(index)] = s;
128+
max = Math.max(s, max);
129+
}
130+
//右边可以合并
131+
if (index + 1 < nums.length && sum[index + 1] > 0) {
132+
long s = sum[uf.find(index + 1)] + sum[uf.find(index)];
133+
uf.union(index + 1, index);
134+
sum[uf.find(index)] = s;
135+
max = Math.max(s, max);
136+
}
137+
}
138+
return res;
139+
}
140+
141+
//并查集
142+
class UnionFind {
143+
public final int[] parents;
144+
public int count;
145+
146+
public UnionFind(int n) {
147+
this.parents = new int[n];
148+
reset();
149+
}
150+
151+
public void reset() {
152+
for (int i = 0; i < parents.length; i++) {
153+
parents[i] = i;
154+
}
155+
count = parents.length - 1;
156+
}
157+
158+
public int find(int i) {
159+
int parent = parents[i];
160+
if (parent == i) {
161+
return i;
162+
} else {
163+
int root = find(parent);
164+
parents[i] = root;
165+
return root;
166+
}
167+
}
168+
169+
public boolean union(int i, int j) {
170+
int r1 = find(i);
171+
int r2 = find(j);
172+
if (r1 != r2) {
173+
count--;
174+
parents[r1] = r2;
175+
return true;
176+
} else {
177+
return false;
178+
}
179+
}
180+
181+
/* void isolate(int x) {
182+
if (x != parents[x]) {
183+
parents[x] = x;
184+
count++;
185+
}
186+
}*/
187+
188+
}
189+
190+
public static void main(String[] args) {
191+
192+
}
193+
}

0 commit comments

Comments
 (0)