题目
给你一个下标从 0 开始的整数数组
tasks
,其中tasks[i]
表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回
-1
。
解题思路
- 找规律:相同难度的任务数 = 2 * n + 3 * m,只有1无法满足;
- 用map统计各难度任务数量;
- 最少轮数肯定要尽可能多的一次完成3个,所以同难度任务数不为1时应为为3n + 1、3n + 2或3n,3n + 1 = 3(n - 1) + 2 * 2(任务数为n + 1),3n + 2(任务数为n + 1),3n(任务数为n)
- 判断相同难度的任务除3是否有余数,有则+1;
- 统计各难度所需要的轮数。
代码展示
class Solution {public int minimumRounds(int[] tasks) {Map<Integer,Integer> data = new HashMap<>();for(int task : tasks){int num = data.getOrDefault(task, 0);data.put(task, num + 1);}int sum = 0;for(Integer num : data.keySet()){if(data.get(num) == 1){return -1;}int n = data.get(num) / 3;if(data.get(num) % 3 != 0){n = n + 1;}sum += n;}return sum;}
}