题目
给你一个下标从 0 开始的整数数组 tasks ,其中 tasks[i] 表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。
返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 -1 。
解析
思路:
1、先把难度相同任务的个数读到map里
2、再计算每个任务需要的最少轮次,累加即可
先来看一下任务数量可能的取值:
1 2 3 4 5 6 7 8 9
其中1是不可能完成的.
3 * k -> 3 6 9
3 * k + 1 -> 4 7
3 * k + 2 ->5 8
要用最少的轮次,那就要尽量每次都做三个任务。
相当于:
3 * k 相当于做了k次三个任务
3 * k + 1 相当于做了k-1次三个任务,2次两个任务
3 * k + 2 相当于做了k次三个任务,1次两个任务
所以实际上后面两种情况可以合并,都是k+1次。
代码
class Solution {unordered_map<int,int> m;
public:int minimumRounds(vector<int>& tasks) {//求最少轮次,每回合就要多做任务int res = 0;int n = tasks.size();for(int i = 0;i<n;i++){m[tasks[i]]++;}for(auto [_,v] : m){if(v == 1){return -1;}else if(v % 3 == 0){res += v/3;}else {res += v/3+1;}}return res;}
};