1235. 規劃兼職工作
阿新 • • 發佈:2022-01-17
你打算利用空閒時間來做兼職工作賺些零花錢。
這裡有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; } }