惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
The Cloudflare Blog
L
LangChain Blog
博客园 - 司徒正美
G
Google Developers Blog
博客园 - 【当耐特】
GbyAI
GbyAI
月光博客
月光博客
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
大猫的无限游戏
大猫的无限游戏
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
D
Docker
MongoDB | Blog
MongoDB | Blog
Vercel News
Vercel News
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
博客园 - 聂微东

蚊子的前端博客

微说 | 有的人觉得只要不考XX,一定能考好!-蚊子的前端博客 微说 | 春天来了-蚊子的前端博客 明天和意外不知道哪个先来-蚊子的前端博客 微说 | 既然错过了路口,就及时止损,重新规划路线上路-蚊子的前端博客 微说 | 2025年的出生人口数是792万-蚊子的前端博客 微说 | 工作年终总结,让写对接的接口的数量?-蚊子的前端博客 微说 | 温家宝:没有政治体制改革的成功 经济体制改革不可能进行到底-蚊子的前端博客 微说 | 违法犯罪了该不该被禁言?-蚊子的前端博客 微说 | 不明白为什么在推荐去俄罗斯旅游-蚊子的前端博客 微说 | 易中天论骗子-蚊子的前端博客 微说 | 一场大风吹散了秋天-蚊子的前端博客 微说 | 既要、又要、还要、更要!-蚊子的前端博客 又是一年的国庆雨季-蚊子的前端博客 微说 | 预估下2025年的出生人口数据-蚊子的前端博客 微说 | 可惜了我那些小时候的书本-蚊子的前端博客 微说 | 牛马有的是,驴不够了!-蚊子的前端博客 微说 | 能否有一条非户口也能高考的路-蚊子的前端博客 微说 | 小聊中医-蚊子的前端博客 微说 | 将要制作的一款新产品-蚊子的前端博客 微说 | 做人要有信-蚊子的前端博客 微说 | 好一个正义联盟-蚊子的前端博客 微说 | 都是见过吃过的主儿-蚊子的前端博客 微说 | 追求8小时工作制有错吗?-蚊子的前端博客 微说 | 如果尖锐的批评完全消失-蚊子的前端博客 微说 | 很好!-蚊子的前端博客 微说 | 封禁用户可以,但要告知具体原因-蚊子的前端博客 微说 | 面朝大海,春暖花开-蚊子的前端博客 微说 | 程序员的悲哀是什么?-蚊子的前端博客 微说 | 2025年出生人口的预测-蚊子的前端博客 前端在 LiveKit 中如何获取所有的参与者-蚊子的前端博客
leetcode2244 如何使用最少的轮数完成任务-蚊子的前端博客
author · 2022-04-24 · via 蚊子的前端博客

题目链接:2244. 完成所有任务需要的最少轮数。题目的关键点有:

  1. 只能完成相同难度级别的任务;
  2. 每轮只能完成 2 个或 3 个任务;
  3. 使用最少的轮数;

因此我们的思路应当是:统计每个难度级别任务的数量,然后优先 3 个一轮来完成任务,最后剩下的再通过 2 个任务的组合来完成。

只有难度级别的任务的数量为 1 时,无法完成,数量>=1 的,都可以通过 2 和 3 的组合来完成。

优先完成 3 个相同级别的任务,那么最后任务剩余的数量可能是:

  • 0 个:恰好是 3 的倍数;
  • 1 个:还剩下 1 个,但这种情况最后一轮就无法完成了,因此再从前面拿出一个 3,通过 2+2 的方式完成;
  • 2 个:通过完成 2 个相同难度级别的方式完成;

最终实现的 C++代码:

class Solution {
public:
    int minimumRounds(vector<int> &tasks) {
        map<int, int> location; // 存储每个级别任务的数量
        int leftTaskNum; // 相同级别任务3个一轮全部完成,剩余的任务数量

        for (int i = 0, size = tasks.size(); i < size; i++) {
            auto it = location.find(tasks[i]);
            if (it == location.end()) {
                location.insert(pair<int, int>(tasks[i], 1));
            } else {
                it->second += 1;
            }
        }
        map<int, int>::iterator it = location.begin();
        int num = 0;
        while (it != location.end()) {
            int item = it->second;
            if (item <= 1) {
                return -1;
            }
            leftTaskNum = item % 3;
            if (leftTaskNum == 0) {
                num += item / 3;
            } else if (leftTaskNum == 1) {
                num += (item - 3) / 3 + 2; // 从前面拿出3个任务,最后用2+2的方式完成,多加两轮
            } else if (leftTaskNum == 2) {
                num += item / 3 + 1;
            }

            it++;
        }
        return num;
    }
};