LC每日一题|20240514 - 2244. 完成所有任务需要的最少轮数

223 阅读1分钟

LC每日一题|20240514 - 2244. 完成所有任务需要的最少轮数

给你一个下标从 0 开始的整数数组 tasks ,其中 tasks[i] 表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。

返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 **-1 **。

提示:

  • 1 <= tasks.length <= 10^5
  • 1 <= tasks[i] <= 10^9

题目等级:Medium

解题思路

一道非常简单的题目~

首先开个map统计一下每种任务出现的次数,然后贪心的计算出完成各种任务所需要的最少轮数,返回加和。

对于某种任务来说,可能会存在如下几种情况。

  1. 该任务只出现1次,不能处理,根据题意返回-1
  2. 该任务出现的次数n % 3 == 0,轮数为n / 3
  3. 该任务出现的次数n % 3 == 2,最后一次需要完成两个任务,轮数为n / 3 + 1
  4. 该任务出现的次数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