comments | difficulty | edit_url | rating | source | tags | ||||
---|---|---|---|---|---|---|---|---|---|
true |
Medium |
1371 |
Weekly Contest 289 Q2 |
|
You are given a 0-indexed integer array tasks
, where tasks[i]
represents the difficulty level of a task. In each round, you can complete either 2 or 3 tasks of the same difficulty level.
Return the minimum rounds required to complete all the tasks, or -1
if it is not possible to complete all the tasks.
Example 1:
Input: tasks = [2,2,3,3,2,4,4,4,4,4] Output: 4 Explanation: To complete all the tasks, a possible plan is: - In the first round, you complete 3 tasks of difficulty level 2. - In the second round, you complete 2 tasks of difficulty level 3. - In the third round, you complete 3 tasks of difficulty level 4. - In the fourth round, you complete 2 tasks of difficulty level 4. It can be shown that all the tasks cannot be completed in fewer than 4 rounds, so the answer is 4.
Example 2:
Input: tasks = [2,3,3] Output: -1 Explanation: There is only 1 task of difficulty level 2, but in each round, you can only complete either 2 or 3 tasks of the same difficulty level. Hence, you cannot complete all the tasks, and the answer is -1.
Constraints:
1 <= tasks.length <= 105
1 <= tasks[i] <= 109
Note: This question is the same as 2870: Minimum Number of Operations to Make Array Empty.
We use a hash table to count the number of tasks for each difficulty level. Then we traverse the hash table. For each difficulty level, if the number of tasks is
Finally, we return the answer.
The time complexity is tasks
array.
class Solution:
def minimumRounds(self, tasks: List[int]) -> int:
cnt = Counter(tasks)
ans = 0
for v in cnt.values():
if v == 1:
return -1
ans += v // 3 + (v % 3 != 0)
return ans
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 v : cnt.values()) {
if (v == 1) {
return -1;
}
ans += v / 3 + (v % 3 == 0 ? 0 : 1);
}
return ans;
}
}
class Solution {
public:
int minimumRounds(vector<int>& tasks) {
unordered_map<int, int> cnt;
for (auto& t : tasks) {
++cnt[t];
}
int ans = 0;
for (auto& [_, v] : cnt) {
if (v == 1) {
return -1;
}
ans += v / 3 + (v % 3 != 0);
}
return ans;
}
};
func minimumRounds(tasks []int) int {
cnt := map[int]int{}
for _, t := range tasks {
cnt[t]++
}
ans := 0
for _, v := range cnt {
if v == 1 {
return -1
}
ans += v / 3
if v%3 != 0 {
ans++
}
}
return ans
}
function minimumRounds(tasks: number[]): number {
const cnt = new Map();
for (const t of tasks) {
cnt.set(t, (cnt.get(t) || 0) + 1);
}
let ans = 0;
for (const v of cnt.values()) {
if (v == 1) {
return -1;
}
ans += Math.floor(v / 3) + (v % 3 === 0 ? 0 : 1);
}
return ans;
}
use std::collections::HashMap;
impl Solution {
pub fn minimum_rounds(tasks: Vec<i32>) -> i32 {
let mut cnt = HashMap::new();
for &t in tasks.iter() {
let count = cnt.entry(t).or_insert(0);
*count += 1;
}
let mut ans = 0;
for &v in cnt.values() {
if v == 1 {
return -1;
}
ans += v / 3 + (if v % 3 == 0 { 0 } else { 1 });
}
ans
}
}