1235. Maximum Profit in Job Scheduling
Difficulty: Hard
Related Topics: Binary Search, Dynamic Programming, Sort
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 * 10<sup>4</sup>1 <= startTime[i] < endTime[i] <= 10<sup>9</sup>1 <= profit[i] <= 10<sup>4</sup>
Solution
Language: Java
class Solution {
public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
List<Task> tasks = new ArrayList<>();
HashMap<Integer, Integer> invertIndex = new HashMap<>();
int[] dp = new int[profit.length];
int maxEnd = 0;
for (int i = 0; i < startTime.length; i ++) {
Task temp = new Task(startTime[i], endTime[i], profit[i]);
tasks.add(temp);
maxEnd = Math.max(maxEnd, endTime[i]);
}
tasks.sort(new Comparator<>() {
public int compare(Task a, Task b) {
return a.end - b.end;
}
});
for (int i = 0; i < tasks.size(); i++) {
invertIndex.put(tasks.get(i).end, i);
}
dp[0] = tasks.get(0).profit;
for (int i = 1; i < tasks.size(); i++) {
dp[i] = Math.max(tasks.get(i).profit, dp[i - 1]);
for (int j = i - 1; j >= 0; j--) {
if (tasks.get(j).end <= tasks.get(i).start) {
dp[i] = Math.max(dp[i], tasks.get(i).profit + dp[j]);
break;
}
}
}
int max = 0;
for (int i = 0; i < dp.length; i ++) {
max = Math.max(max, dp[i]);
}
return max;
}
}
class Task {
int start;
int end;
int profit;
Task(int start, int end, int profit) {
this.start = start;
this.end = end;
this.profit = profit;
}
}

本文介绍了一种通过动态规划和二分查找解决不重叠任务调度以获得最大利润的方法。给定开始时间、结束时间和利润,算法能找出不冲突的任务组合以达到利润最大化。
1809

被折叠的 条评论
为什么被折叠?



