题目来源
我的题解
方法一 贪心+排序
先按结束时间排序,然后判断之前可用的已运行的时刻是否大于等于当前任务需要的时刻,若是则不需要额外的时刻,否则需要额外的时刻(使用贪心的策略从右往前加)
时间复杂度:O(n×M),其中 n 是 tasks 的大小,M 是 tasks 的时间段右端点 end 的最大值。
空间复杂度:O(M+logn)。对 tasks 数组进行排序需要 O(logn),run 数组需要 O(M)。
public int findMinimumTime(int[][] tasks) {
Arrays.sort(tasks,(a,b)->a[1]-b[1]);
int n=tasks.length;
//记录哪些时刻在执行任务
int[] hasRun=new int[tasks[n-1][1]+1];
int res=0;
for(int i=0;i<n;i++){
int left=tasks[i][0];
int right=tasks[i][1];
int d=tasks[i][2];
//先看之前已经在运行的时刻是不是有当前任务需要的时刻
for(int j=left;j<=right;j++)
d-=hasRun[j];
//若之前可用的已运行的时刻大于等于当前任务需要的时刻,则不需要额外的时刻
res+=Math.max(d,0);
//若之前可用的已运行的时刻小于于当前任务需要的时刻,需要额外的时刻,这里使用贪心的策略从右往前加
for(int j=right;j>=0&&d>0;j--){
if(hasRun[j]==0){
d-=1;
hasRun[j]=1;
}
}
}
return res;
}
方法二
时间复杂度:
空间复杂度:
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~