1235. 规划兼职工作
你打算利用空闲时间来做兼职工作赚些零花钱。
这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。
给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得的最大报酬。
注意,时间上出现重叠的 2 份工作不能同时进行。
如果你选择的工作在时间 X 结束,那么你可以立刻进行在时间 X 开始的下一份工作。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-profit-in-job-scheduling
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
class Solution {
public int jobScheduling(int[] startTime, int[] endTime, int[] profits) {
int n = startTime.length;
Info[] infos = new Info[n];
for (int i = 0; i < n; ++i) {
infos[i] = new Info(startTime[i], endTime[i], profits[i]);
}
Arrays.sort(infos, new Comparator<Info>() {
@Override
public int compare(Info o1, Info o2) {
return Integer.compare(o1.endTime, o2.endTime);
}
});
TreeMap<Integer, Integer> dp = new TreeMap<>();
int ans = 0;
for (Info info : infos) {
Integer profit = dp.getOrDefault(info.endTime, 0);
Map.Entry<Integer, Integer> entry = dp.floorEntry(info.startTime);
if (entry != null) {
profit = Math.max(profit, info.profit + entry.getValue());
} else {
profit = Math.max(profit, info.profit);
}
ans = Math.max(ans, profit);
dp.put(info.endTime, ans);
}
return ans;
}
}
class Info {
int startTime;
int endTime;
int profit;
public Info(int startTime, int endTime, int profit) {
this.startTime = startTime;
this.endTime = endTime;
this.profit = profit;
}
}
心之所向,素履以往 生如逆旅,一苇以航
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理