Leetcode 1235. Maximum Profit in Job Scheduling(Hard)

本文探讨了如何通过排序和动态规划解决非重叠任务的最大利润问题。通过将工作按结束时间排序,并使用二分查找和映射来跟踪最大利润,我们实现了时间复杂度为O(NlogN)的高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

We have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtaining a profit of profit[i].
You’re given the startTime , endTime and profit arrays, you need to output the maximum profit you can take such that there are no 2 jobs in the subset with overlapping time range.
If you choose a job that ends at time X you will be able to start another job that starts at time X.

Example 1:
在这里插入图片描述
Input: startTime = [1,2,3,3], endTime = [3,4,5,6], profit = [50,10,40,70]
Output: 120
Explanation: The subset chosen is the first and fourth job.
Time range [1-3]+[3-6] , we get profit of 120 = 50 + 70.

Example 2:
在这里插入图片描述Input: startTime = [1,2,3,4,6], endTime = [3,5,10,6,9], profit = [20,20,100,70,60]
Output: 150
Explanation: The subset chosen is the first, fourth and fifth job.
Profit obtained 150 = 20 + 70 + 60.
Example 3:
在这里插入图片描述
Input: startTime = [1,1,1], endTime = [2,3,4], profit = [5,6,4]
Output: 6
Constraints:
1 <= startTime.length == endTime.length == profit.length <= 5 * 10^4
1 <= startTime[i] < endTime[i] <= 10^9
1 <= profit[i] <= 10^4

题解:

lee215

Explanation
Sort the jobs by endTime.

dp[time] = profit means that within the first time duration,
we cam make at most profit money.
Intial dp[0] = 0, as we make profit = 0 at time = 0.

For each job = [s, e, p], where s,e,p are its start time, end time and profit,
Then the logic is similar to the knapsack problem.
If we don’t do this job, nothing will be changed.
If we do this job, binary search in the dp to find the largest profit we can make before start time s.
So we also know the maximum cuurent profit that we can make doing this job.

Compare with last element in the dp,
we make more money,
it worth doing this job,
then we add the pair of [e, cur] to the back of dp.
Otherwise, we’d like not to do this job.

Complexity

Time O(NlogN) for sorting
Time O(NlogN) for binary search for each job
Space O(N)

class Solution {
public:
    int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
        struct job{
            int start,end,profit;
            job(int a,int b,int c):start(a),end(b),profit(c){}
            bool operator < (const job &t)const{
                return end<t.end;
            }
        };
        vector<job> jobs;//sorted by end ascending
        for(int i=0;i<startTime.size();i++){
            jobs.push_back(job(startTime[i],endTime[i],profit[i]));
        }
        sort(jobs.begin(),jobs.end());
        
        map<int,int> dp={{0,0}};//dp[endTime,maxprofit]
        for(auto job:jobs){
        	//now.maxprofit=dp[endtime<thisjob.startTime].maxprofit+thisjob.profit
        	//upper_bound return iterator it, job.startTime<it.first
        	//prev, it--. prev.first<=job.startTime
            int cur = prev(dp.upper_bound(job.start))->second+job.profit;
            if(cur>=dp.rbegin()->second)//update maxprofit yet, rbegin():the last iterator
                dp[job.end]=cur;//do this job if we get greater profit
        }
        return dp.rbegin()->second;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值