Skip to content

Commit 9d3f8be

Browse files
committed
weekly contest 318
1 parent cfb3d5d commit 9d3f8be

File tree

2 files changed

+156
-0
lines changed

2 files changed

+156
-0
lines changed

README.md

Lines changed: 1 addition & 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 318](src/main/java/weekly/wk318.java) 模拟 | 滑动窗口 | 双指针 | DP
78
* ☀️ [weekly contest 317](src/main/java/weekly/wk317.java) 数组 | hash | 贪心+模拟 | 树形DP
89
* ☀️ [weekly contest 316](src/main/java/weekly/wk316.java) 模拟 | gcd | 前缀和 | 分情况
910
* ☀️ [weekly contest 315](src/main/java/weekly/wk315.java) Hash表 | Hash表 | 暴力 | 双指针

src/main/java/weekly/wk318.java

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package weekly;
2+
3+
import java.util.Arrays;
4+
import java.util.Collections;
5+
import java.util.HashMap;
6+
import java.util.HashSet;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.PriorityQueue;
10+
import java.util.Set;
11+
import java.util.TreeMap;
12+
13+
public class wk318 {
14+
15+
//ranking: 411 / 5670
16+
17+
//直接做
18+
public int[] applyOperations(int[] nums) {
19+
20+
for (int i = 0; i < nums.length - 1; i++) {
21+
if (nums[i] == nums[i + 1]) {
22+
nums[i] *= 2;
23+
nums[i + 1] = 0;
24+
}
25+
}
26+
int[] ans = new int[nums.length];
27+
int i = 0;
28+
for (int num : nums) {
29+
if (num > 0) {
30+
ans[i++] = num;
31+
}
32+
}
33+
return ans;
34+
}
35+
36+
37+
//滑动窗口
38+
public long maximumSubarraySum(int[] nums, int k) {
39+
Map<Integer, Integer> map = new HashMap<>();
40+
Set<Integer> set = new HashSet<>();
41+
long sum = 0;
42+
for (int i = 0; i < k - 1; i++) {
43+
sum += nums[i];
44+
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
45+
if (map.get(nums[i]) > 1) {
46+
set.add(nums[i]);
47+
}
48+
}
49+
long ans = 0;
50+
for (int i = k - 1; i < nums.length; i++) {
51+
sum += nums[i];
52+
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
53+
if (map.get(nums[i]) > 1) {
54+
set.add(nums[i]);
55+
}
56+
if (set.size() == 0) {
57+
ans = Math.max(sum, ans);
58+
}
59+
60+
int val = map.get(nums[i - k + 1]) - 1;
61+
if (val == 1) {
62+
set.remove(nums[i - k + 1]);
63+
}
64+
map.put(nums[i - k + 1], val);
65+
sum -= nums[i - k + 1];
66+
}
67+
return ans;
68+
}
69+
70+
71+
//双指针模拟
72+
public long totalCost(int[] costs, int k, int candidates) {
73+
PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((a, b) -> costs[a[0]] == costs[b[0]] ? a[0] - b[0] : costs[a[0]] - costs[b[0]]);
74+
int left = 0, right = costs.length - 1;
75+
for (; left < candidates && left <= right; left++) {
76+
priorityQueue.add(new int[]{left, 0});
77+
}
78+
for (; right >= costs.length - candidates && right >= left; right--) {
79+
priorityQueue.add(new int[]{right, 1});
80+
}
81+
long ans = 0;
82+
while (k-- > 0 && !priorityQueue.isEmpty()) {
83+
int[] poll = priorityQueue.poll();
84+
ans += costs[poll[0]];
85+
if (left <= right) {
86+
if (poll[1] == 0) {
87+
priorityQueue.add(new int[]{left++, 0});
88+
} else {
89+
priorityQueue.add(new int[]{right--, 1});
90+
}
91+
}
92+
}
93+
return ans;
94+
}
95+
//直接dfs就别想了
96+
/* public long minimumTotalDistance(List<Integer> robot, int[][] factory) {
97+
help(robot, 0, factory, 0);
98+
return min;
99+
}
100+
101+
long min = Long.MAX_VALUE;
102+
Map<Integer, Integer> memo = new HashMap<>();
103+
104+
void help(List<Integer> robot, int index, int[][] factory, long ans) {
105+
if (index >= robot.size()) {
106+
min = Math.min(min, ans);
107+
return;
108+
}
109+
110+
for (int j = 0; j < factory.length; j++) {
111+
factory[j][1]--;
112+
if (factory[j][1] >= 0) {
113+
long val = Math.abs(factory[j][0] - robot.get(index));
114+
help(robot, index + 1, factory, ans + val);
115+
}
116+
factory[j][1]++;
117+
}
118+
}*/
119+
120+
121+
//dp,不好想
122+
public long minimumTotalDistance(List<Integer> robot, int[][] factory) {
123+
//都进行排序才能连续分配
124+
Arrays.sort(factory, (a, b) -> a[0] - b[0]);
125+
Collections.sort(robot);
126+
127+
//dp[i][j]表示前i个工厂和前j个机器人的最少消耗
128+
long[][] dp = new long[factory.length + 1][robot.size() + 1];
129+
for (int i = 0; i < dp.length; i++) {
130+
for (int j = 1; j < dp[0].length; j++) {
131+
dp[i][j] = (long) 1e18;
132+
}
133+
}
134+
135+
136+
for (int i = 0; i < factory.length; i++) {
137+
//考虑第i个工厂
138+
int[] f = factory[i];
139+
//考虑第j个机器人
140+
for (int j = 1; j <= robot.size(); j++) {
141+
long cost = 0;
142+
//同步之前的状态,即不用这个工厂的最少消耗
143+
dp[i + 1][j] = dp[i][j];
144+
//k表示在这个工厂里分配k个机器人,所有k<(j,limit(factory(i)))
145+
for (int k = 1; k <= Math.min(f[1], j); k++) {
146+
//cost累加计算
147+
cost += Math.abs((long) f[0] - robot.get(j - k));
148+
//取最小消耗
149+
dp[i + 1][j] = Math.min(dp[i + 1][j], cost + dp[i][j - k]);
150+
}
151+
}
152+
}
153+
return dp[factory.length][robot.size()];
154+
}
155+
}

0 commit comments

Comments
 (0)