热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode_回溯_中等_2305.公平分发饼干

目录

目录

  • 1.题目
  • 2.思路
  • 3.代码实现(Java)


1.题目

给你一个整数数组 COOKIEs ,其中 COOKIEs[i] 表示在第 i 个零食包中的饼干数量。另给你一个整数 k 表示等待分发零食包的孩子数量,所有 零食包都需要分发。在同一个零食包中的所有饼干都必须分发给同一个孩子,不能分开。

分发的不公平程度定义为单个孩子在分发过程中能够获得饼干的最大总数。

返回所有分发的最小不公平程度。

示例 1:
输入:COOKIEs = [8, 15, 10, 20, 8], k = 2
输出:31
解释:一种最优方案是 [8, 15, 8] 和 [10, 20] 。

  • 第 1 个孩子分到 [8, 15, 8] ,总计 8 + 15 + 8 = 31 块饼干。
  • 第 2 个孩子分到 [10, 20] ,总计 10 + 20 = 30 块饼干。

分发的不公平程度为 max(31, 30) = 31 。
可以证明不存在不公平程度小于 31 的分发方案。

示例 2:
输入:COOKIEs = [6, 1, 3, 2, 2, 4, 1, 2], k = 3
输出:7
解释:一种最优方案是 [6, 1]、[3, 2, 2] 和 [4, 1, 2] 。

  • 第 1 个孩子分到 [6, 1] ,总计 6 + 1 = 7 块饼干。
  • 第 2 个孩子分到 [3, 2, 2] ,总计 3 + 2 + 2 = 7 块饼干。
  • 第 3 个孩子分到 [4, 1, 2] ,总计 4 + 1 + 2 = 7 块饼干。

分发的不公平程度为 max(7, 7, 7) = 7 。
可以证明不存在不公平程度小于 7 的分发方案。

提示:
2 <&#61; COOKIEs.length <&#61; 8
1 <&#61; COOKIEs[i] <&#61; 105
2 <&#61; k <&#61; COOKIEs.length

来源&#xff1a;力扣&#xff08;LeetCode&#xff09;
链接&#xff1a;https://leetcode.cn/problems/fair-distribution-of-COOKIEs

2.思路

&#xff08;1&#xff09;回溯算法
思路参考该 LeetCode 用户题解。

本题可以看作 698.划分为k个相等的子集 这题的一个变形&#xff0c;对于集合划分问题来说&#xff0c;我们可以知道每个集合可容纳的大小&#xff1b;但是本问题只是让我们尽可能保证均匀划分&#xff0c;即题目中的分发的最小不公平程度

相关题目&#xff1a;
LeetCode_回溯_中等_473.火柴拼正方形
LeetCode_回溯_中等_698.划分为k个相等的子集

3.代码实现&#xff08;Java&#xff09;

//思路1————回溯算法
class Solution {// res 记录所有分发的最小不公平程度&#xff0c;其初始值为 Integer.MAX_VALUEprivate int res &#61; Integer.MAX_VALUE;public int distributeCOOKIEs(int[] COOKIEs, int k) {//定义 k 个桶(集合)&#xff0c;每个桶记录装入当前桶的元素之和int[] buckets &#61; new int[k];//对数组 COOKIEs 进程降序排序Arrays.sort(COOKIEs);for (int i &#61; 0, j &#61; COOKIEs.length - 1; i < j; i&#43;&#43;, j--) {//交换 COOKIEs[i] 和 COOKIEs[j]int temp &#61; COOKIEs[i];COOKIEs[i] &#61; COOKIEs[j];COOKIEs[j] &#61; temp;}backtrack(COOKIEs, 0, buckets);return res;}private void backtrack(int[] COOKIEs, int start, int[] buckets) {if (start &#61;&#61; COOKIEs.length) {//一次划分中的最大值int maxVal &#61; Arrays.stream(buckets).max().getAsInt();//更新 resres &#61; Math.min(res, maxVal);return;}//空桶数量int emptyBuckets &#61; 0;for (int bucket : buckets) {if (bucket &#61;&#61; 0) {emptyBuckets&#43;&#43;;}}//剪枝 1if (emptyBuckets > COOKIEs.length - start) {return;}for (int i &#61; 0; i < buckets.length; i&#43;&#43;) {//剪枝 2if (i > 0 && buckets[i] &#61;&#61; buckets[i - 1]) {continue;}//剪枝 3if (buckets[i] &#43; COOKIEs[start] > res) {continue;}buckets[i] &#43;&#61; COOKIEs[start];//进入到下一层backtrack(COOKIEs, start &#43; 1, buckets);buckets[i] -&#61; COOKIEs[start];}}
}


推荐阅读
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
author-avatar
王叶-诺_714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有