weighted job schedule 1235
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, 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 * 1041 <= startTime[i] < endTime[i] <= 1091 <= profit[i] <= 104
class Solution { public int jobScheduling(int[] startTime, int[] endTime, int[] profit) { List<int[]> list = new ArrayList<>(); for(int i = 0; i < startTime.length; i++) { list.add(new int[]{startTime[i], endTime[i], profit[i]}); } //将任务按照开始时间排序 Collections.sort(list, (x, y) -> x[0] - y[0]); //创建一个堆,用于存放截止某些之间的最大profit PriorityQueue<int[]> pq = new PriorityQueue<>((x, y) -> x[0] - y[0]); int preProfit = 0; for(int[] tuple : list) { int start = tuple[0], end = tuple[1], value = tuple[2]; //如果小于当前start,那么只需要保留截止start之前的最大profit即可 while(!pq.isEmpty() && pq.peek()[0] <= start) { preProfit = Math.max(preProfit, pq.poll()[1]); } //将当前value + starttime之前的最大profit, 放入heap pq.offer(new int[]{end, value + preProfit}); } //轮询heap,找出最大profit int result = 0; while(!pq.isEmpty()) { result = Math.max(result, pq.poll()[1]); } return result; } }