概述
今天的题目比较简单,没花多少时间就做出来,我采用了HashMap来作为分组存储,只要key存在就往value+1,我们直接看题目
题目
给你一个下标从 0 开始的整数数组 tasks
,其中 tasks[i]
表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。
返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 -1
。
示例 1:
输入:tasks = [2,2,3,3,2,4,4,4,4,4] 输出:4 解释:要想完成所有任务,一个可能的计划是: - 第一轮,完成难度级别为 2 的 3 个任务。 - 第二轮,完成难度级别为 3 的 2 个任务。 - 第三轮,完成难度级别为 4 的 3 个任务。 - 第四轮,完成难度级别为 4 的 2 个任务。 可以证明,无法在少于 4 轮的情况下完成所有任务,所以答案为 4 。
示例 2:
输入:tasks = [2,3,3] 输出:-1 解释:难度级别为 2 的任务只有 1 个,但每一轮执行中,只能选择完成 2 个或者 3 个相同难度级别的任务。因此,无法完成所有任务,答案为 -1 。
提示:
1 <= tasks.length <= 105
1 <= tasks[i] <= 109
解题思路
1、对数据循环,用HashMap存储对数组进行分组,实现每一个值出现次数+1;
2、循环HashMap数组,当key的value出现等于1,说明没办法按照题目实现2次3次的处理,因为最小处理单位是2,这样直接返回-1;
3、当key的value等于2,满足每次执行2的次数,直接相加+1;
4、当key的value能被3整除,直接用每次执行3的次数,执行次数+value/3;
5、剩下就是贪心算法,只要求3的余数,又因为3的余数只有1或者2,其实两种得到的结果是相同的,当为1的时候将3的次数减1,2的次数加1就行,当为2时只要将2的次数加1就可,比如10和11,10%3=1,11%3=2,但是最后两个得到的轮数不变同样是4次。
代码
class Solution {
public int minimumRounds(int[] tasks) {
int num = 0;
HashMap<Integer, Integer> hashMap = new HashMap<>();
for (int task : tasks) {
if (hashMap.containsKey(task)) {
int val = hashMap.get(task);
hashMap.replace(task, val + 1);
} else {
hashMap.put(task, 1);
}
}
for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + "," + entry.getValue());
if (entry.getValue() == 1) {
return -1;
} else if (entry.getValue() == 2) {
//只有一个2
num++;
} else if (entry.getValue() % 3 == 0) {
num += entry.getValue() / 3;
} else if (entry.getValue() % 3 == 1 || entry.getValue() % 3 == 2) {
num += entry.getValue() / 3 + 1;
}
}
return num;
}
}