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

题解:

Sort the job based on the end time.

Use a TreeMap to maintain the end time with its maximum profit.

For a job, starting at st, ending at et, profit pt. Find the previous job with which is cumpatible with current job using TreeMap.

If previous profit + current profit is larger than last end time profit, put it into the TreeMap.

If not, we choose not schedule current job. It means previous with the smaller end time, we already have larger profit.

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  阅读(79)  评论(0编辑  收藏  举报