完成所有任务需要的最少轮数 - (LeetCode)

11 篇文章 0 订阅

概述

今天的题目比较简单,没花多少时间就做出来,我采用了HashMap来作为分组存储,只要key存在就往value+1,我们直接看题目

题目

给你一个下标从 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

解题思路

1、对数据循环,用HashMap存储对数组进行分组,实现每一个值出现次数+1;

2、循环HashMap数组,当key的value出现等于1,说明没办法按照题目实现2次3次的处理,因为最小处理单位是2,这样直接返回-1;

3、当key的value等于2,满足每次执行2的次数,直接相加+1;

4、当key的value能被3整除,直接用每次执行3的次数,执行次数+value/3;

5、剩下就是贪心算法,只要求3的余数,又因为3的余数只有1或者2,其实两种得到的结果是相同的,当为1的时候将3的次数减1,2的次数加1就行,当为2时只要将2的次数加1就可,比如10和11,10%3=1,11%3=2,但是最后两个得到的轮数不变同样是4次。

代码

class Solution {
    public int minimumRounds(int[] tasks) {
        int num = 0;
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int task : tasks) {
            if (hashMap.containsKey(task)) {
                int val = hashMap.get(task);
                hashMap.replace(task, val + 1);
            } else {
                hashMap.put(task, 1);
            }
        }
        for (Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {
            System.out.println(entry.getKey() + "," + entry.getValue());
            if (entry.getValue() == 1) {
                return -1;
            } else if (entry.getValue() == 2) {
                //只有一个2
                num++;
            } else if (entry.getValue() % 3 == 0) {
                
                num += entry.getValue() / 3;
            } else if (entry.getValue() % 3 == 1 || entry.getValue() % 3 == 2) {
                num += entry.getValue() / 3 + 1;
            }
        }
        return num;
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值