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;
    }
}
posted @   Tianyiya  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示