Skip to content

Commit 59e1c57

Browse files
committed
weekly contest 381
1 parent 15cece9 commit 59e1c57

File tree

4 files changed

+336
-9
lines changed

4 files changed

+336
-9
lines changed

README.md

+2
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 381](src/main/java/weekly/wk381.java) 贪心 | 贪心 | floyd
78
* 🐼 [weekly contest 380](src/main/java/weekly/wk380.java) 遍历 | kmp | 二分+数位dp | kmp+二分
89
* 🐼 [weekly contest 379](src/main/java/weekly/wk379.java) 遍历 | 贪心 | 分类
910
* 🐼 [weekly contest 377](src/main/java/weekly/wk377.java) 模拟 | 哈希 | floyd
@@ -86,6 +87,7 @@ leetcode url: <https://leetcode.cn/u/cctest/>
8687
* 🐶 [weekly contest 290](src/main/java/weekly/wk290.java)
8788
* 🐭 [weekly contest 280](src/main/java/weekly/wk289.java)
8889

90+
* 🐸 [biweekly contest 122](src/main/java/weekly/wkb122.java) 滑动窗口+双推 | 分组循环 | 贪心 | 滑动窗口+双堆
8991
* 🐸 [biweekly contest 121](src/main/java/weekly/wkb121.java) 遍历 | 贪心 | 异或 | 数位dp
9092
* 🐸 [biweekly contest 120](src/main/java/weekly/wkb120.java) 双指针 | 贪心 | 双指针 | dfs
9193
* 🐸 [biweekly contest 119](src/main/java/weekly/wkb119.java) 遍历 | 贪心 | 滑动窗口 | 状态压缩+Floyd

src/main/java/weekly/wk381.java

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
5+
public class wk381 {
6+
7+
// 贪心
8+
public int minimumPushes(String word) {
9+
int ans = 0;
10+
int[] counter = new int[26];
11+
for (int i = 0; i < word.length(); i++) {
12+
char c = word.charAt(i);
13+
counter[c - 'a']++;
14+
}
15+
Arrays.sort(counter);
16+
17+
int[] c = new int[4];
18+
Arrays.fill(c, 8);
19+
for (int i = counter.length - 1; i >= 0; i--) {
20+
if (counter[i] == 0) continue;
21+
for (int j = 0; j < c.length; j++) {
22+
if (c[j] == 0) continue;
23+
else {
24+
c[j]--;
25+
ans += (j + 1) * counter[i];
26+
break;
27+
}
28+
29+
}
30+
}
31+
32+
return ans;
33+
}
34+
35+
//floyd算法
36+
// public int[] countOfPairs(int n, int x, int y) {
37+
// int[] res = new int[n];
38+
// if (y < x) {
39+
// int t = y;
40+
// y = x;
41+
// x = t;
42+
// }
43+
//
44+
// int f[][] = new int[n][n];
45+
// for (int[] ints : f) {
46+
// Arrays.fill(ints, Integer.MAX_VALUE / 2);
47+
// }
48+
// for (int i = 0; i < f.length; i++) {
49+
// f[i][i] = 0;
50+
// }
51+
//
52+
// for (int i = 1; i < f.length; i++) {
53+
// f[i][i - 1] = 1;
54+
// f[i - 1][i] = 1;
55+
// }
56+
// f[x-1][y-1] = 1;
57+
// f[y-1][x-1] = 1;
58+
// // Floyd计算剩下节点的最短路径
59+
// for (int k = 0; k < n; k++) {
60+
// for (int i = 0; i < n; i++) {
61+
// for (int j = 0; j < n; j++) {
62+
// f[i][j] = Math.min(f[i][j], f[i][k] + f[k][j]);
63+
// }
64+
// }
65+
// }
66+
//
67+
//
68+
// for (int i = 1; i <= n; i++) {
69+
// for (int j = i + 1; j <= n; j++) {
70+
// int k = f[i-1][j-1];
71+
// res[k-1]++;
72+
// }
73+
// }
74+
// for (int i = 0; i < res.length; i++) {
75+
// res[i] *= 2;
76+
// }
77+
// return res;
78+
// }
79+
80+
81+
//超时过不了了
82+
public long[] countOfPairs(int n, int x, int y) {
83+
long[] res = new long[n];
84+
if (y < x) {
85+
int t = y;
86+
y = x;
87+
x = t;
88+
}
89+
90+
int f[][] = new int[n][n];
91+
for (int[] ints : f) {
92+
Arrays.fill(ints, Integer.MAX_VALUE / 2);
93+
}
94+
for (int i = 0; i < f.length; i++) {
95+
f[i][i] = 0;
96+
}
97+
98+
for (int i = 1; i < f.length; i++) {
99+
f[i][i - 1] = 1;
100+
f[i - 1][i] = 1;
101+
}
102+
f[x-1][y-1] = 1;
103+
f[y-1][x-1] = 1;
104+
// Floyd计算剩下节点的最短路径
105+
for (int k = 0; k < n; k++) {
106+
for (int i = 0; i < n; i++) {
107+
for (int j = 0; j < n; j++) {
108+
f[i][j] = Math.min(f[i][j], f[i][k] + f[k][j]);
109+
}
110+
}
111+
}
112+
113+
114+
for (int i = 1; i <= n; i++) {
115+
for (int j = i + 1; j <= n; j++) {
116+
int k = f[i-1][j-1];
117+
res[k-1]++;
118+
}
119+
}
120+
for (int i = 0; i < res.length; i++) {
121+
res[i] *= 2;
122+
}
123+
return res;
124+
}
125+
126+
public static void main(String[] args) {
127+
wk381 w = new wk381();
128+
w.countOfPairs(5, 1, 5);
129+
}
130+
}

src/main/java/weekly/wkb119.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,16 @@ public int numberOfSets(int n, int maxDistance, int[][] roads) {
9393
}
9494
}
9595

96-
// Floyd计算剩下节点的最短路径
97-
for (int k = 0; k < n; k++) {
98-
if ((s >> k & 1) == 0) continue;
99-
for (int i = 0; i < n; i++) {
100-
if ((s >> i & 1) == 0) continue;
101-
for (int j = 0; j < n; j++) {
102-
f[i][j] = Math.min(f[i][j], f[i][k] + f[k][j]);
96+
// Floyd计算剩下节点的最短路径
97+
for (int k = 0; k < n; k++) {
98+
if ((s >> k & 1) == 0) continue;
99+
for (int i = 0; i < n; i++) {
100+
if ((s >> i & 1) == 0) continue;
101+
for (int j = 0; j < n; j++) {
102+
f[i][j] = Math.min(f[i][j], f[i][k] + f[k][j]);
103+
}
104+
}
103105
}
104-
}
105-
}
106106

107107
//判断路径是不是符合条件
108108
int flag=0;

src/main/java/weekly/wkb122.java

+195
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
package weekly;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.util.Collections;
6+
import java.util.HashMap;
7+
import java.util.HashSet;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.PriorityQueue;
11+
import java.util.Set;
12+
13+
public class wkb122 {
14+
15+
public int minimumCost(int[] nums) {
16+
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
17+
for (int i = 1; i < nums.length; i++) {
18+
priorityQueue.add(nums[i]);
19+
}
20+
int ans = nums[0];
21+
for (int i = 0; i < 2; i++) {
22+
ans += priorityQueue.poll();
23+
}
24+
return ans;
25+
}
26+
27+
// public boolean canSortArray(int[] nums) {
28+
// List<List<Integer>> counter = new ArrayList<>();
29+
// List<List<Integer>> indexes = new ArrayList<>();
30+
// for (int i = 0; i <= 8; i++) {
31+
// counter.add(new ArrayList<>());
32+
// indexes.add(new ArrayList<>());
33+
// }
34+
// for (int i = 0; i < nums.length; i++) {
35+
// int c = Integer.bitCount(nums[i]);
36+
// counter.get(c).add(i);
37+
// indexes.get(c).add(i);
38+
// }
39+
// for (List<Integer> list : counter) {
40+
// Collections.sort(list, (a, b) -> nums[a] - nums[b]);
41+
// }
42+
// int[] temp = new int[nums.length];
43+
// for (int i = 0; i <= 8; i++) {
44+
// for (int j = 0; j < counter.get(i).size(); j++) {
45+
// temp[indexes.get(i).get(j)]=nums[counter.get(i).get(j)];
46+
// }
47+
// }
48+
// for (int i = 1; i < temp.length; i++) {
49+
// if(temp[i]<temp[i-1])return false;
50+
// }
51+
// return true;
52+
// }
53+
54+
55+
//分组循环
56+
public boolean canSortArray(int[] nums) {
57+
int preMax = 0;
58+
59+
int i = 0;
60+
while (i < nums.length) {
61+
int max=nums[i];
62+
int ones=Integer.bitCount(nums[i]);
63+
while (i<nums.length&&ones==Integer.bitCount(nums[i])){
64+
if(nums[i]<preMax){
65+
return false;
66+
}
67+
max=Math.max(max,nums[i]);
68+
}
69+
preMax=max;
70+
}
71+
72+
return true;
73+
}
74+
75+
// public int minimumArrayLength(int[] nums) {
76+
// Map<Integer, Integer> counter = new HashMap<>();
77+
// int min = nums[0];
78+
// for (int num : nums) {
79+
// counter.put(num, counter.getOrDefault(num, 0) + 1);
80+
// min = Math.min(min, num);
81+
// }
82+
// int c = counter.get(min);
83+
// return (c+1)/2;
84+
// }
85+
86+
//贪心
87+
public int minimumArrayLength(int[] nums) {
88+
Map<Integer, Integer> counter = new HashMap<>();
89+
for (int num : nums) {
90+
counter.put(num, counter.getOrDefault(num, 0) + 1);
91+
}
92+
Arrays.sort(nums);
93+
int min = nums[0];
94+
int ans = -1;
95+
96+
//能不能构造出小于min的整数
97+
boolean canFind = false;
98+
for (int i = 0; i < nums.length; i++) {
99+
if (nums[i] % min != 0) {
100+
canFind = true;
101+
}
102+
}
103+
104+
if (canFind) {
105+
return 1;
106+
} else {
107+
return (counter.get(min) + 1) / 2;
108+
}
109+
}
110+
111+
112+
// 滑动窗口中的前 k 小值
113+
// 滑动窗口+双堆+懒删除
114+
// 或 treeMap
115+
public long minimumCost(int[] nums, int k, int dist) {
116+
long ans = Long.MAX_VALUE;
117+
long sum = 0;
118+
119+
//记录堆里有哪些还没被删除
120+
Set<Integer> leftSet = new HashSet<>();
121+
Set<Integer> rightSet = new HashSet<>();
122+
//大跟堆
123+
PriorityQueue<Integer> leftPq = new PriorityQueue<>((a, b) -> nums[b] - nums[a]);
124+
//小跟堆
125+
PriorityQueue<Integer> rightPq = new PriorityQueue<>((a, b) -> nums[a] - nums[b]);
126+
for (int i = 1; i < Math.min(1 + dist, nums.length); i++) {
127+
//左堆添加
128+
leftSet.add(i);
129+
leftPq.add(i);
130+
sum += nums[i];
131+
if (leftPq.size() > k - 1) {
132+
133+
//左堆删除
134+
Integer poll = leftPq.poll();
135+
leftSet.remove(poll);
136+
sum -= nums[poll];
137+
138+
//右堆添加
139+
rightPq.add(poll);
140+
rightSet.add(poll);
141+
}
142+
}
143+
144+
for (int begin = 1; begin + dist < nums.length; begin++) {
145+
int end = begin + dist;
146+
//左堆添加
147+
leftPq.add(end);
148+
leftSet.add(end);
149+
sum += nums[end];
150+
while (leftSet.size() > k - 1) {
151+
Integer poll = leftPq.poll();
152+
//是不是之前已经被删除了
153+
if (!leftSet.contains(poll)) continue;
154+
//左堆删除
155+
leftSet.remove(poll);
156+
sum -= nums[poll];
157+
158+
//右堆添加
159+
rightPq.add(poll);
160+
rightSet.add(poll);
161+
}
162+
163+
// 结果判断
164+
ans = Math.min(sum, ans);
165+
166+
// 开始滑动窗口
167+
//左堆是不是有这个
168+
if (leftSet.contains(begin)) {
169+
//左堆删除,pq先不变
170+
sum -= nums[begin];
171+
leftSet.remove(begin);
172+
}
173+
// 右堆也可能删除
174+
rightSet.remove(begin);
175+
176+
// 左堆不足k-1个,用右堆来补齐
177+
while (!rightSet.isEmpty() && leftSet.size() < k - 1) {
178+
//右堆删除
179+
Integer poll = rightPq.poll();
180+
if (!rightSet.contains(poll)) continue;
181+
//左堆添加
182+
leftPq.add(poll);
183+
leftSet.add(poll);
184+
sum += nums[poll];
185+
}
186+
}
187+
return ans + nums[0];
188+
}
189+
190+
191+
public static void main(String[] args) {
192+
wkb122 w = new wkb122();
193+
w.minimumCost(new int[]{1, 3, 2, 6, 4, 2}, 3, 3);
194+
}
195+
}

0 commit comments

Comments
 (0)