Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d731cde

Browse files
committed
clean code
1 parent c877abf commit d731cde

File tree

4 files changed

+40
-45
lines changed

4 files changed

+40
-45
lines changed

‎leetcode/leetcode-21/src/main/java/Solution2071.java

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
1+
import java.util.ArrayDeque;
12
import java.util.Arrays;
2-
import java.util.Map;
3-
import java.util.TreeMap;
3+
import java.util.Deque;
44

55
public class Solution2071 {
66
public int maxTaskAssign(int[] tasks, int[] workers, int pills, int strength) {
77
Arrays.sort(tasks);
8-
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
9-
for (int worker : workers) {
10-
treeMap.put(worker, treeMap.getOrDefault(worker, 0) + 1);
11-
}
8+
Arrays.sort(workers);
9+
int mn = Math.min(tasks.length, workers.length);
1210

13-
// 注意边界: 任务能全部被完成
14-
if (checkMid(tasks, new TreeMap<>(treeMap), pills, strength, tasks.length)) {
15-
return tasks.length;
16-
}
1711
// 二分查找
1812
int left = 1;
19-
int right = tasks.length;
13+
int right = mn + 1;
2014
while (left < right) {
2115
int mid = left + (right - left) / 2;
2216
// 边界二分 F, F,..., F, [T, T,..., T]
2317
// ----------------------^
24-
if (!checkMid(tasks, newTreeMap<>(treeMap), pills, strength, mid)) {
18+
if (!checkMid(tasks, workers, pills, strength, newArrayDeque<>(), mid)) {
2519
right = mid;
2620
} else {
2721
left = mid + 1;
@@ -30,34 +24,33 @@ public int maxTaskAssign(int[] tasks, int[] workers, int pills, int strength) {
3024
return left - 1;
3125
}
3226

33-
// 能否完成 mid 个任务
34-
private boolean checkMid(int[] tasks, TreeMap<Integer, Integer> workerMap, int pills, int strength, int mid) {
35-
for (int i = mid - 1; i >= 0; i--) {
36-
Map.Entry<Integer, Integer> ceilingEntry = workerMap.ceilingEntry(tasks[i]);
37-
if (ceilingEntry != null) {
38-
// 不使用药丸
39-
if (ceilingEntry.getValue() > 1) {
40-
workerMap.put(ceilingEntry.getKey(), ceilingEntry.getValue() - 1);
41-
} else {
42-
workerMap.remove(ceilingEntry.getKey());
43-
}
44-
} else {
45-
// 使用药丸
46-
if (pills == 0) {
47-
return false;
48-
}
49-
pills--;
50-
Map.Entry<Integer, Integer> entry = workerMap.ceilingEntry(tasks[i] - strength);
51-
if (entry != null) {
52-
if (entry.getValue() > 1) {
53-
workerMap.put(entry.getKey(), entry.getValue() - 1);
54-
} else {
55-
workerMap.remove(entry.getKey());
56-
}
57-
} else {
58-
return false;
59-
}
27+
// 添加(能完成的)任务:往队尾插入数据。
28+
// 删除最简单的任务:去掉队首。
29+
// 删除(能完成的)最难的任务:去掉队尾。
30+
private boolean checkMid(int[] tasks, int[] workers, int pills, int strength, Deque<Integer> dq, int k) {
31+
// 贪心:用最强的 k 名工人,完成最简单的 k 个任务
32+
int i = 0;
33+
for (int j = workers.length - k; j < workers.length; j++) { // 枚举工人
34+
int w = workers[j];
35+
// 在吃药的情况下,把能完成的任务记录到 buf 中
36+
while (i < k && tasks[i] <= w + strength) {
37+
dq.addLast(tasks[i]);
38+
i++;
39+
}
40+
// 即使吃药也无法完成任务
41+
if (dq.isEmpty()) return false;
42+
// 无需吃药就能完成(最简单的)任务
43+
if (w >= dq.getFirst()) {
44+
dq.removeFirst();
45+
continue;
46+
}
47+
// 必须吃药
48+
if (pills == 0) { // 没药了
49+
return false;
6050
}
51+
pills--;
52+
// 完成(能完成的)最难的任务
53+
dq.removeLast();
6154
}
6255
return true;
6356
}

‎leetcode/leetcode-22/src/main/java/Solution2131.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33

44
public class Solution2131 {
55
public int longestPalindrome(String[] words) {
6-
Map<String, Integer> cntMap = new HashMap<>();
7-
for (String word : words) {
8-
cntMap.put(word, cntMap.getOrDefault(word, 0) + 1);
6+
Map<String, Integer> cnt = new HashMap<>();
7+
for (String w : words) {
8+
cnt.merge(w, 1, Integer::sum);
99
}
1010

1111
// 分类讨论
1212
int maxLen = 0;
1313
boolean pickXx = false;
14-
for (Map.Entry<String, Integer> entry : cntMap.entrySet()) {
14+
for (Map.Entry<String, Integer> entry : cnt.entrySet()) {
1515
String key = entry.getKey();
1616
String reverseKey = new StringBuilder(key).reverse().toString();
1717
// xy - yx
1818
if (!key.equals(reverseKey)) {
19-
int val = Math.min(entry.getValue(), cntMap.getOrDefault(reverseKey, 0));
19+
int val = Math.min(entry.getValue(), cnt.getOrDefault(reverseKey, 0));
2020
maxLen += val * 2;
2121
}
2222
// xx - xx

‎leetcode/leetcode-24/src/main/java/Solution2359.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import java.util.Arrays;
22

33
public class Solution2359 {
4-
private static final int INF = 100000;
4+
private static final int INF = (int) 1e5;
55

66
public int closestMeetingNode(int[] edges, int node1, int node2) {
77
int n = edges.length;

‎leetcode/leetcode-25/src/main/java/Solution2471.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,6 @@ public int minimumOperations2(TreeNode root) {
104104
105105
问题等价于:无序数组交换任意两个元素 最少交换次数
106106
https://blog.csdn.net/qq_50332374/article/details/118612496
107+
相似题目: 3551. 数位和排序需要的最小交换次数
108+
https://leetcode.cn/problems/minimum-swaps-to-sort-by-digit-sum/description/
107109
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /