2244. 完成所有任务需要的最少轮数
给你一个下标从 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
原站题解
rust 解法, 执行用时: 25 ms, 内存消耗: 4 MB, 提交时间: 2024-05-14 07:40:11
use std::collections::HashMap; impl Solution { pub fn minimum_rounds(tasks: Vec<i32>) -> i32 { let mut cnt = HashMap::new(); for &t in &tasks { *cnt.entry(t).or_insert(0) += 1; } let mut ans = 0; for &c in cnt.values() { if c == 1 { return -1; } ans += (c + 2) / 3; } ans } }
javascript 解法, 执行用时: 111 ms, 内存消耗: 66.7 MB, 提交时间: 2024-05-14 07:39:55
/** * @param {number[]} tasks * @return {number} */ var minimumRounds = function(tasks) { const cnt = new Map(); for (const t of tasks) { cnt.set(t, (cnt.get(t) ?? 0) + 1); } let ans = 0; for (const c of cnt.values()) { if (c === 1) { return -1; } ans += Math.ceil(c / 3); } return ans; };
cpp 解法, 执行用时: 164 ms, 内存消耗: 104.8 MB, 提交时间: 2024-05-14 07:39:39
class Solution { public: int minimumRounds(vector<int>& tasks) { unordered_map<int, int> cnt; for (int t : tasks) { cnt[t]++; } int ans = 0; for (auto& [_, c] : cnt) { if (c == 1) { return -1; } ans += (c + 2) / 3; } return ans; } };
java 解法, 执行用时: 24 ms, 内存消耗: 60.2 MB, 提交时间: 2024-05-14 07:39:25
public class Solution { public int minimumRounds(int[] tasks) { Map<Integer, Integer> cnt = new HashMap<>(); for (int t : tasks) { cnt.merge(t, 1, Integer::sum); } int ans = 0; for (int c : cnt.values()) { if (c == 1) { return -1; } ans += (c + 2) / 3; } return ans; } }
golang 解法, 执行用时: 132 ms, 内存消耗: 9.7 MB, 提交时间: 2022-12-09 15:39:06
func minimumRounds(tasks []int) (ans int) { cnt := map[int]int{} for _, task := range tasks { cnt[task]++ } for _, c := range cnt { if c == 1 { return -1 } ans += (c + 2) / 3 } return }
python3 解法, 执行用时: 100 ms, 内存消耗: 27.9 MB, 提交时间: 2022-12-09 15:38:32
class Solution: def minimumRounds(self, tasks: List[int]) -> int: cnt = Counter(tasks) return sum((c + 2) // 3 for c in cnt.values()) if 1 not in cnt.values() else -1
golang 解法, 执行用时: 172 ms, 内存消耗: 9.2 MB, 提交时间: 2022-12-09 15:37:26
func minimumRounds(tasks []int) int { mp := map[int]int{} for _, t := range tasks { mp[t]++ } ans := 0 for _, k := range mp { if k == 1 { return -1 } if k % 3 == 0 { ans += k / 3 } else { ans += k/3 + 1 } } return ans }
python3 解法, 执行用时: 120 ms, 内存消耗: 27.9 MB, 提交时间: 2022-12-09 15:35:18
class Solution: def minimumRounds(self, tasks: List[int]) -> int: c = Counter(tasks) ans = 0 for _, k in c.items(): if k == 1: return -1 ans += k//3 + (0 if k%3 == 0 else 1) return ans