1. 程式人生 > >貪心算法-分餅幹問題

貪心算法-分餅幹問題

如果 port [] args 下標索引 下標 如何 尺寸 問題

1、題目描述

  假設你是一位很棒的家長,想要給你的孩子們一些小餅幹。但是,每個孩子最多只能給一塊餅幹。對每個孩子 i ,都有一個胃口值 gi ,這是能讓孩子們滿足胃口的餅幹的最小尺寸;並且每塊餅幹 j ,都有一個尺寸 sj 。如果 sj >= gi ,我們可以將這個餅幹 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 }

貪心算法-分餅幹問題