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

(java)leetcode445分发饼干(AssignCookies)

题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 gi,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块
题目描述:

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例1:

输入: [1,2,3], [1,1]
输出: 1
解释:
你有三个孩子和两块小饼乾,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼乾,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。

示例2:

输入: [1,2], [1,2,3]
输出: 2
解释:
你有两个孩子和三块小饼乾,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

注意:

  • 你可以假设胃口值为正。
  • 一个小朋友最多只能拥有一块饼干。
解题思路:

第一眼看到这个题目觉得是个很有趣的题目,不知道为啥,就是觉得有趣,如果你觉得上面的题目描述的不够清楚,那我在举个例子:有 m 个人在食堂等着吃饭,每个人的饭量都不一样,有大有小,设每个人的饭量为 mi ,但是食堂能提供的饭一共只有 n 份,每份饭的分量也不一样,有多有少,设每份饭的分量为 ni ;然后把饭分下去,问你有多少人能够吃饱。

我们解决问题的思路是,先让人羣按照饭量从小到大排好队,把饭也按分量从小到大排好,从饭量最小的人开始过来领饭,发盒饭的人首先把分量最小的盒饭拿出来,问他能不能吃饱,如果能,就让他领走,如果不能,就给拿出下一份,知道他领到他能吃饱的盒饭,或者盒饭发完了。那他吃不饱的盒饭就只能丢掉,因为其他人饭量都比他大或者和他一样,他吃不饱的其他人肯定也吃不饱。每次让一个人吃饱了,计数器就加一,一直到所有的盒饭发完,或者所有的人都领到盒饭,这个算法就结束。返回计数器的结果,就是吃饱的人数。(这次觉得自己把思路讲的还算清楚。)

下面看代码实现,首先对数组排序,我想到的是利用List来存储盒饭,领完一盒或者丢掉一盒,就remove这份盒饭。这里涉及到一个知识点,如何将int型数组转成list,遇到的问题还挺多,详情请看另一篇博客(完成后再添加链接)。后来发现这样还挺麻烦,效率也不高,直接在数组中操作就行。

代码实现(java):

class Solution {
public int findContentChildren(int[] g, int[] s) {

int glength=g.length;
int slength=s.length;
int num=0;

//数组排序
Arrays.sort(g);
Arrays.sort(s);

//数组转list
List sList = Arrays.stream( s ).boxed().collect(Collectors.toList());

//循环给每个人发盒饭
for(int i=0;i if(sList==null)
return num;
for(Integer s1:sList){
if(g[i]==s1){
num++;
sList.remove(s1);
break;
}
else if(g[i] num++;
sList.remove(s1);
break;
}

}
}

return num;

}

改进后:

class Solution {
public int findContentChildren(int[] g, int[] s) {
Arrays.sort(g);
Arrays.sort(s);

int gi = 0;
int si = 0;

while(gi if(s[si]>=g[gi]){
gi++; //领到一盒能吃饱的盒饭;换下一个人过来领
}
si++; //不管盒饭吃不吃得饱,领过的盒饭就不能在领了
}
return gi; //gi就是领到吃的饱的盒饭的人数
}
}

本人才疏学浅,文中若有错误或有更好的方法,欢迎在评论中指出,共同进步。


推荐阅读
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • Java中List的forEach方法与字符串拼接的兼容性问题
    本文深入探讨了在Java中使用List的forEach方法时遇到的字符串拼接问题,提供了有效的解决方案及背后的原理分析,旨在帮助开发者更好地理解和解决此类问题。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 深入理解Java字节码:方法调用详解
    本文详细介绍了Java字节码中的方法调用机制,通过具体示例解析了字节码如何处理方法调用及其参数传递。文章由Mahmoud Anouti撰写,原文链接:https://dzone.com/articles/introduction-to-java-bytecode ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文详细探讨了select和epoll两种I/O多路复用技术的内部实现原理,分析了它们在处理大量文件描述符时的性能差异,并通过具体示例代码展示了select的工作流程。 ... [详细]
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 本文探讨了如何选择一个合适的序列化版本ID(serialVersionUID),包括使用生成器还是简单的整数,以及在不同情况下应如何处理序列化版本ID。 ... [详细]
  • 贡献转移在计算每个元素的作用的时候,我们可以通过反向枚举作用效果,添加到作用元素的身上,这种方法叫做贡献转移。更正式的说, ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文探讨了如何利用动态规划解决LeetCode上的1218题——最长固定差值子序列问题。该问题是在给定数组中找到最长的等差数列子序列,其中等差数列的公差是固定的。文中不仅介绍了基本的动态规划解法,还提供了优化后的解决方案。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 本文介绍了一种在 Android 开发中动态修改 strings.xml 文件中字符串值的有效方法。通过使用占位符,开发者可以在运行时根据需要填充具体的值,从而提高应用的灵活性和可维护性。 ... [详细]
author-avatar
潘月飞--_758
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有