贪心算法-分饼干问题

1、题目描述

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

  注意事项:你可以假设胃口值为正。一个小朋友最多只能拥有一块饼干。

2、问题分析:

  题目要求用给定的饼干分发给不同的小朋友,这些小朋友的需求量是不一样的,饼干的大小也是有大有小,大的饼干能分配给胃口比较小的孩子,反之胃口大的孩子只能用更大的饼干才能满足,那么如何分配才能使尽可能多的小朋友有饼干吃呢?每个小朋友最多只能有一块饼干,言外之意就是不能用几块饼干合并起来凑成一个大的饼干。

3、算法思想:贪心算法(对于小的饼干尽可能的去满足胃口比较小的孩子,对于较大的饼干尽可能的去满足胃口比较大的孩子)

   1、首先对表示孩子胃口的数组和表示饼干大小的数组进行从小到大的排序

  2、设置两个“指针”,child指针表示当前得到满足的孩子的个数;cookie指针当前正在遍历饼干的下标索引值

  3、按照饼干数组的个数进行while循环遍历,每遍历到一个饼干,就拿这个饼干去试图满足当前胃口最小的孩子,如果能满足这个孩子,则能满足的孩子个数就加一

  4、不管前一个饼干能不能满足最小胃口的孩子,cookie指针都会向后移动一个位置

4、解题代码:

 1 package com.baozi.test;
 2 
 3 import java.util.Arrays;
 4 
 5 /**
 6  * @author BaoZi
 7  * @create 2019-05-14-15:21
 8  */
 9 public class Solution2 {
10     public static void main(String[] args) {
11         int[] g = new int[]{5, 10, 2, 9, 15, 9};
12         int[] s = new int[]{6, 1, 20, 3, 8};
13         int children = Solution2.findContentChildren(g, s);
14         System.out.println(children);
15     }
16 
17     public static int findContentChildren(int[] g, int[] s) {
18         //1、先对两个数组进行排序
19         Arrays.sort(g);
20         Arrays.sort(s);
21         //设置指针child代表当前有几个孩子得到满足
22         //设置指针cookie代表当前正在遍历饼干的下标索引值
23         int child = 0;
24         int cookie = 0;
25         /**
26          * 通过while循环的方式从饼干数组的第一个数据拿出来去试图满足第一个孩子,如果满足的话,当前得到满足的
27          * 孩子数加一;
28          * 不管这个饼干能不能满足这个孩子,都只试图比较一次,紧接着去遍历下一个饼干
29          */
30         while (child < g.length && cookie < s.length) {
31             if (g[child] <= s[cookie]) {
32                 child++;
33             }
34             cookie++;
35         }
36         return child;
37     }
38 }
原文地址:https://www.cnblogs.com/BaoZiY/p/10861390.html