LeetCode每日一题: 1723. 完成所有工作的最短时间
1723. 完成所有工作的最短时间
题目
给你一个整数数组 jobs
,其中 jobs[i]
是完成第 i
项工作要花费的时间。
请你将这些工作分配给 k
位工人。所有工作都应该分配给工人,且每项工作只能分配给一位工人。工人的 工作时间 是完成分配给他们的所有工作花费时间的总和。请你设计一套最佳的工作分配方案,使工人的 最大工作时间 得以 最小化 。
返回分配方案中尽可能 最小 的 最大工作时间 。
示例 1:
输入:jobs = [3,2,3], k = 3
输出:3
解释:给每位工人分配一项工作,最大工作时间是 3 。
示例 2:
输入:jobs = [1,2,4,7,8], k = 2
输出:11
解释:按下述方式分配工作:
1 号工人:1、2、8(工作时间 = 1 + 2 + 8 = 11)
2 号工人:4、7(工作时间 = 4 + 7 = 11)
最大工作时间是 11 。
提示:
1 <= k <= jobs.length <= 12
1 <= jobs[i] <= 107
思路
一开始其实是想的分支限界法,但实在代码能力不强,而且一个人可能有多个工作,也可能没有,所以真的搞出来还是很难,更别说我还不会写分支限界的代码= =。也不知道有没有大佬有分支限界的思路解决这个问题。
总之姑且是搞出了基本的DFS回溯,果然超时了= =:
class Solution {int[] num;// 工人工作的数组int res = Integer.MAX_VALUE;public int minimumTimeRequired(int[] jobs, int k) {num = new int[k];dfs(jobs, 0, k);return res;}public void dfs(int[] jobs, int job, int k) {// 工作分配完了,把最小的最大工作时间记录下来:if (job >= jobs.length) {// 找到数组中最大值int max = 0;for (int i : num) {max = Math.max(max, i);}// 记录最小的最大工作时间res = Math.min(max, res);return;}// 给人分配工作,然后dfs+回溯for (int i = 0; i < k; i++) {num[i] += jobs[job];dfs(jobs, job + 1, k);// job+1:分配下一个工作num[i] -= jobs[job];}}
}
之后怎么剪枝就不知道了,这个回溯的过程递归树我都不能完全理解清楚,只是单纯的套了下回溯的模板就不知道为什么能过几个测试用例= =。
然后也是看了一下宫水三叶大佬的题解(官方题解看的我有点自闭= =),发现了两点:
1,可以把max当成递归参数传递,就不用每次找了;
2,max >= res
直接return,比起每次res = Math.min(max, res);
要稍微快一些;
然后就是最重要的剪枝了:
1,如果后面的工人还没被安排工作,那那些没被安排工作的都是一样的,不需要一个个枚举,直接把工作安排给任何一个人就行了;
2,如果有人空闲,比起将工作安排给已经有工作的人,肯定是将工作安排给没工作的人时间更短,那就没必要再枚举那些有工作的人了;
结合上面的两点,最终就有了下面的代码
官方题解还有dp状态压缩什么的,理解不能,饶了我吧= =。
二分的倒是能理解,dfs基础上套就好了,不过还是有点麻烦,代码量比较大,理解起来也是有点难度的,自己写出来就更难了,所以姑且就到这吧。
代码
class Solution {int res = Integer.MAX_VALUE;int[] jobs;int k;public int minimumTimeRequired(int[] jobs, int k) {this.jobs = jobs;this.k = k;dfs(0, 0, new int[k], 0);return res;}/*** @param max 当前工作时长数组中的最大值* @param j 现在要处理的工作* @param num 各个工人的工作时长数组(这个放全局和放递归里面应该都可以,怕错所以就放递归参数里了)* @param man 已经被分配工作的人数*/public void dfs(int max, int j, int[] num, int man) {if (max >= res) return;if (j >= jobs.length) {res = max;return;}// 已经被分配工作的人数小于k的话,就不用再一一对后面的空闲工人或前面已工作的工人枚举了;if (man < k) {// 有空闲的人直接将工作分配给空闲的;num[man] += jobs[j];dfs(Math.max(num[man], max), j + 1, num, man + 1);// 分配工作的人+1num[man] = 0;}// 后续照常枚举,注意是要小于man,// 跟小于k差不多,只是对于前面有空闲的人进行了剪枝,所以必须保证递归树是相同的;for (int i = 0; i < man; i++) {num[i] += jobs[j];dfs(Math.max(num[i], max), j + 1, num, man);num[i] -= jobs[j];}}
}
LeetCode每日一题: 1723. 完成所有工作的最短时间相关推荐
- 【LeetCode/力扣】1723. 完成所有工作的最短时间
1 题目描述 题目链接:https://leetcode-cn.com/problems/find-minimum-time-to-finish-all-jobs/ 给你一个整数数组 jobs ,其中 ...
- 【LeetCode每日一题】1723. 完成所有工作的最短时间
[LeetCode每日一题]1723. 完成所有工作的最短时间 [1] 1723. 完成所有工作的最短时间 [2] 473. 火柴拼正方形 [1] 1723. 完成所有工作的最短时间 题目: 给你一个 ...
- [leetcode每日一题2021/5/8]1723. 完成所有工作的最短时间
1723. 完成所有工作的最短时间 题目 思路 动态规划 状态转移方程 优化 求和打表 快速枚举每种选取情况jjj的子集ppp 代码 算法复杂度 题目来源于leetcode,解法和思路仅代表个人观点. ...
- leetcode 1723.完成所有工作的最短时间 - 二分+递归
leetcode 1723.完成所有工作的最短时间 - 二分+递归 题干 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有 ...
- LeetCode 1723 完成所有工作的最短时间 题解
LeetCode 1723 完成所有工作的最短时间 题解 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工作都应该分配给 ...
- (leetcode)1723. 完成所有工作的最短时间 -2021/5/8
文章目录 1723. 完成所有工作的最短时间 javascript 1723. 完成所有工作的最短时间 javascript 题目: 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i ...
- 1723. 完成所有工作的最短时间
原题链接:1723. 完成所有工作的最短时间 solution: dfs + 回溯 + 剪枝 ①结束条件:任务分配完成,maxt保存所有工人的最大工作时长,再用maxt和以前的最大工作 ...
- Leetcode-二分+递归/回溯-1723. 完成所有工作的最短时间
题目1723. 完成所有工作的最短时间: 题解: 递归回溯模板超时 按照模板+简单剪枝,超时 class Solution { private:vector<int> sum;int mi ...
- LeetCode每日一题——1235. 规划兼职工作
LeetCode每日一题系列 题目:1235. 规划兼职工作 难度:困难 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你打算利用空闲时间来做兼职工作赚些零花钱. 这里有 n ...
最新文章
- 常量指针与指向常量的指针
- 数据结构 如何删除单向链表的倒数第m个元素
- insightface scrfd人脸检测测试
- 面向对象——单例设计模式
- Report not added to business roles
- 笔记本电脑关机后指示灯还亮_汽车仪表常见指示符号之清洗液指示灯,灯亮了怎么办?...
- 媲美专业相机? 看看华为P40带来的影像新突破!
- java .jar怎么打开_详解jar文件怎么打开
- 《炬丰科技-半导体工艺》--技术资料合集14
- 奥克兰大学 计算机硕士 GPA,奥克兰大学GPA
- 软件工程阶段性总结(二)——软件计划和需求分析
- 华为认证Datacom和Routing Switching方向的优势
- 树梅派应用22:树莓派 SAKS 扩展板实用应用 之 DS1307 RTC 时钟模块
- matplotlib 绘制柱状图且上方显示数据
- 禀赋效应还是锚定效应
- “羊了个羊”是如何吸引住你的
- 临近新春佳节,如何多快好省地买遍全球年货?
- 【Kafka】第三篇-Kafka的集群及Canal介绍
- 2021阳城一中高考成绩查询,2017阳城一中录取分数线(附2017高考成绩喜报)
- platform平台驱动模型简述(linux驱动开发篇)