public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
int n = startTime.length;
int[][] jobs = new int[n][3];
for (int i = 0; i < n; i++) {
jobs[i] = new int[]{startTime[i], endTime[i], profit[i]};
}
Arrays.sort(jobs, (a, b) -> a[1] - b[1]);//按结束时间排序
int[] dp = new int[n + 1];//考虑前i个工作的最大报酬
dp[0]=0;//不考虑工作
for (int i = 1; i <= n; i++) {
int k = minGreater(jobs, i-1 , jobs[i - 1][0]);//在前i-1个工作中寻找结束时间不大于当前工作开始时间的最大值索引
dp[i] = Math.max(dp[i - 1], dp[k+1] + jobs[i - 1][2]);//不考虑当前工作或考虑当前工作
}
return dp[n];
}
public int minGreater(int[][] arr,int r,int tar){
int l=-1;//左边界为-1,表示找不到
//l与r相邻时,l指向<=tar的最大值,r指向>tar的最小值
while(l+1<r){
int mid=(l+r)>>1;
if(arr[mid][1]<=tar)
l=mid;//如果mid<=tar,则mid可能为<tar的最大值,或者=tar
else
r=mid;//如果mid>tar,则mid可能为>tar的最小值
}
return l;
}
2022.10.22-----leetcode.1235
最新推荐文章于 2024-07-25 11:27:31 发布