Leetcode 1235. Maximum Profit in Job Scheduling(Hard)

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值