LeetCode 1723 完成所有工作的最短时间[二分法 回溯] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1723 完成所有工作的最短时间[二分法 回溯] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
使用二分法的思想,为最小的最大工作时间进行限定,不断查找,然后DFS深搜遍历回溯,中间有不少优化的股过程,在代码中注释已经很详尽了,代码如下:
class Solution {
public:
bool backtrack(vector<int>& jobs, vector<int>& workloads, int idx, int limit) {
// 工作都派完了
if (idx >= jobs.size()) {
return true;
}
int cur = jobs[idx];
for (auto& workload : workloads) {
if (workload + cur <= limit) {
workload += cur;
if (backtrack(jobs, workloads, idx + 1, limit)) {
return true;
}
// 回溯,给别人干试试
workload -= cur;
}
// 如果当前工人未被分配工作,那么下一个工人也必然未被分配工作
// 或者当前工作恰能使该工人的工作量达到了上限
// 这两种情况下我们无需尝试继续分配工作
if (workload == 0 || workload + cur == limit) {// 意思就是没活了或者已经能够达到最大工作量
break;
}
}
return false;
}
bool check(vector<int>& jobs, int k, int limit) {
// 定义每个人的工作量
vector<int> workloads(k, 0);
return backtrack(jobs, workloads, 0, limit);
}
int minimumTimeRequired(vector<int>& jobs, int k) {
// 按照从大到小排序
sort(jobs.begin(), jobs.end(), greater<int>());
// 找范围的中间值
int l = jobs[0], r = accumulate(jobs.begin(), jobs.end(), 0);
while (l < r) {
// 除2取整操作,用mid = (l + r) / 2 也未尝不可
int mid = (l + r) >> 1;
// 如果工作量超了
if (check(jobs, k, mid)) {
r = mid;
} else {// 如果工作量不够
l = mid + 1;
}
}
return l;
}
};
以上是关于LeetCode 1723 完成所有工作的最短时间[二分法 回溯] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1723. 完成所有工作的最短时间 Find Minimum Time to Finish All Jobs(Java)
LeetCode 1723 完成所有工作的最短时间[二分法 回溯] HERODING的LeetCode之路