该题解采用二分搜索与回溯的方法来解决问题。首先对工作时间数组进行排序,以便优先尝试分配耗时较长的工作,这有助于尽早达到最大工作时间的限制。在二分搜索的每一步,使用中值 'mid' 作为尝试的最大工作时间限制。在回溯部分,使用一个辅助函数 'check' 来递归尝试将每项工作分配给工人,直到所有工作都能在 'mid' 时间内被成功分配,或者无法分配为止。如果可以成功分配,则缩小搜索范围,否则增大 'mid'。通过这种方式逐步缩小可能的最大工作时间,直到找到最小可能值。
时间复杂度: O((log(sum(jobs) - max(jobs))) * k^n)
空间复杂度: O(n + k)
class Solution:
def check(self, work_loads, jobs, i, limit):
if i >= len(jobs):
return True
cur_job = jobs[i]
for now_worker in range(len(work_loads)):
if work_loads[now_worker] + cur_job <= limit:
work_loads[now_worker] += cur_job
if self.check(work_loads, jobs, i + 1, limit):
return True
work_loads[now_worker] -= cur_job
if work_loads[now_worker] == 0 or work_loads[now_worker] + cur_job == limit:
break
return False
def minimumTimeRequired(self, jobs: List[int], k: int) -> int:
if k >= len(jobs):
return max(jobs)
jobs.sort(reverse=True)
r = sum(jobs)
l = max(r // k, max(jobs))
while l < r:
mid = (l + r) // 2
work_load = [0 for _ in range(k)]
if self.check(work_load, jobs, 0, mid):
r = mid
else:
l = mid + 1
return l
# Binary search to minimize the maximum work time
# Use recursion to distribute jobs and check if it fits within the limit