LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)
Posted 爱若信若盼若
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)相关的知识,希望对你有一定的参考价值。
1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Hard)
##DFS##
采用回溯、剪枝
每项工作都有可能分给不同的工人,因此采用回溯法枚举所有可能的情况,并更新可能的最短的最大工作时间ans
,对于不可能比ans
小的最大工作时间的情况,直接剪枝
时间复杂度: O ( m n ) O(m^n) O(mn),m为工人数,n为任务数
class Solution {
int ans = Integer.MAX_VALUE;
public int minimumTimeRequired(int[] jobs, int k) {
int[] times = new int[k];
// 排序比不排序要更快
Arrays.sort(jobs);
dfs(jobs, times, 0, k);
return ans;
}
// times数组记录每个工人当前的工作时间,cnt记录遍历到第cnt项工作,k为工人数量
public void dfs(int[] jobs, int[] times, int cnt, int k) {
// 遍历完所有工作的情况
if (cnt == jobs.length) {
int max = Arrays.stream(times).max().getAsInt();
if (max < ans) ans = max;
return;
}
for (int i = 0; i < k; i ++) {
//当前情况下,不可能比ans更小,剪枝
if (jobs[cnt] + times[i] > ans) {
continue;
}
// 第i个工人执行第cnt项工作
times[i] += jobs[cnt];
dfs(jobs, times, cnt + 1, k);
// 恢复现场
times[i] -= jobs[cnt];
// 等于0时,已经出现了最小答案,直接返回
if (times[i] == 0) break;
}
}
}
以上是关于LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)