1. 程式人生 > 其它 >1235. 規劃兼職工作

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;
    }
}
心之所向,素履以往 生如逆旅,一葦以航