LeetCode 1235. Maximum Profit in Job Scheduling

原题链接在这里:https://leetcode.com/problems/maximum-profit-in-job-scheduling/

题目:

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 startTimeendTime and profit arrays, return the maximum profit you can take such that there are no two 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 * 104
  • 1 <= startTime[i] < endTime[i] <= 109
  • 1 <= profit[i] <= 104

题解:

Have a dp[j], which means up to j, what is the maximum profit.

Have job, starting at st, ending at et, profit pt. The previous job with index ind who is cumpatible with current job.

dp[j] = Math.max(dp[ind] + pt, dp[j - 1]).

dp[j - 1] is the maximum profit until the last job. We could to choose to schedule or not schedule current job.

Time Complexity: O(nlogn). n = statTime.length.

Space: O(n).

AC Java:

 1 class Solution {
 2     public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
 3         int n = startTime.length;
 4         int [][] jobs = new int[n][3];
 5         for(int i = 0; i < n; i++){
 6             jobs[i] = new int[]{startTime[i], endTime[i], profit[i]};
 7         }
 8         
 9         Arrays.sort(jobs, (a, b) -> a[1] - b[1]);
10         TreeMap<Integer, Integer> dp = new TreeMap<>();
11         dp.put(0, 0);
12         for(int [] job : jobs){
13             int cur = dp.get(dp.floorKey(job[0])) + job[2];
14             if(cur > dp.lastEntry().getValue()){
15                 dp.put(job[1], cur);
16             }
17         }
18         
19         return dp.lastEntry().getValue();
20     }
21 }

类似Maximum Length of Pair Chain.

posted @ 2022-07-19 02:24  Dylan_Java_NYC  阅读(75)  评论(0编辑  收藏  举报