LeetCode刷题记158-1665. 完成所有任务的最少初始能量
LeetCode刷题记158
1665. 完成所有任务的最少初始能量
class Solution {
public int minimumEffort(int[][] tasks) {
// 直接数组排序快一点
Arrays.sort(tasks, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] - o1[0] == o2[1] - o2[0]) {
return o2[1] - o1[1]; // 相等的话,需要大的在其前面
} else {
// 需要和最低差值大的在前面
return o2[1] - o2[0] - (o1[1] - o1[0]);
}
}
});
int ans = 0;
int rest = 0;
for (int i = 0; i < tasks.length; i ++) {
if (tasks[i][1] > rest) {
// 需要的大于上一个任务剩余的
ans += tasks[i][1] - rest; // 那就补充一下初始能量
rest = tasks[i][1] - tasks[i][0]; // 最小剩余就是完成这次任务之后的
} else {
// 上次任务剩下的能量够用了
rest -= tasks[i][0]; //减去这次用的
}
}
// 上面直接排序比下面用优先队列快
// PriorityQueue<Pair<Integer, Integer>> queue = new PriorityQueue<Pair<Integer, Integer>>(
// new Comparator<Pair<Integer, Integer>>() {
// @Override
// public int compare(Pair<Integer, Integer> a, Pair<Integer, Integer> b) {
// if (a.getKey() == b.getKey()) {
// return b.getValue() - a.getValue();
// } else {
// return b.getKey() - a.getKey();
// }
// }
// }
// );
// for (int i = 0; i < tasks.length; i ++) {
// queue.add(new Pair(tasks[i][1] - tasks[i][0], tasks[i][1]));
// }
// int ans = 0;
// int rest = 0;
// while (!queue.isEmpty()) {
// Pair<Integer, Integer> e = queue.poll();
// // System.out.println(e);
// if (e.getValue() > rest) {
// ans += e.getValue() - rest;
// rest = e.getKey();
// } else {
// rest -= e.getValue() - e.getKey();
// }
// }
return ans;
}
}
上一篇:
IDEA上Java项目控制台中文乱码
