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 startTime
, endTime
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 }