LC每日一题|20240514 - 2244. 完成所有任务需要的最少轮数
给你一个下标从 0 开始的整数数组
tasks,其中tasks[i]表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 **
-1**。
提示:
1 <= tasks.length <= 10^51 <= tasks[i] <= 10^9
题目等级:Medium
解题思路
一道非常简单的题目~
首先开个map统计一下每种任务出现的次数,然后贪心的计算出完成各种任务所需要的最少轮数,返回加和。
对于某种任务来说,可能会存在如下几种情况。
- 该任务只出现
1次,不能处理,根据题意返回-1 - 该任务出现的次数
n % 3 == 0,轮数为n / 3 - 该任务出现的次数
n % 3 == 2,最后一次需要完成两个任务,轮数为n / 3 + 1 - 该任务出现的次数
n % 3 == 1,因为万一最后只剩1的话就不能处理了,所以可以让前边任意一轮中少处理一个任务,最后一轮再处理两个任务,轮数为n / 3 + 1
最后拼起来就完事儿了~
AC代码
class Solution {
fun minimumRounds(tasks: IntArray): Int {
val map = HashMap<Int, Int>()
tasks.forEach { map[it] = (map[it] ?: 0) + 1 }
var res = 0
map.forEach {
val value = it.value
if (value == 1) return -1
res += value / 3
if (value % 3 != 0) res += 1
}
return res
}
}
时间复杂度:O(n),遍历两圈
空间复杂度:O(n),开辟map