455.分发饼干

455.分发饼干

题目

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/assign-cookies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

大尺寸的饼干即可以满足胃口大的孩子也可以满足胃口小的,那么优先满足胃口大的。
这里的局部最优解就是大饼干喂给胃口大的,全局最优解就是喂饱更多的小孩。

先将两个数组排序。

大的饼干满足胃口大的小孩,那么就需要从后往前排序
如果这个饼干满足了小孩
那么饼干索引-1,小孩索引-1
如果这个饼干没有满足小孩
说明这个小孩不能被满足了,因为前面的饼干更小,那么就需要去满足胃口更小的小孩,小孩的索引--,饼干的索引不变。
那么不管满不满足,小孩的索引总是要--的,就循环小孩数组。index来标记饼干的索引。

如何标记这个饼干已经被分了?饼干先从数组的最后一个选起,如果这个饼干被分了index--,当index<0时说明分完了。

代码

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        int count = 0;
        Arrays.sort(g);
        Arrays.sort(s);
        int index = s.length-1;
        for(int i=g.length-1;i>=0;--i){
            if(index>=0&&s[index]>=g[i]){
                ++count;
                --index;       
            }
        }
        return count;
    }
}

反向考虑下,小的饼干优先满足胃口小的,也可以满足更多的小孩。

满足了这个小孩
那么这个饼干就被用了,饼干的索引+1,需要去满足下一个小孩,小孩的索引+1
没有满足这个小孩
那么就要用更大的饼干去满足,饼干索引+1,小孩索引不变。
所以不管满足没有,饼干索引都要+1,就用循环来遍历饼干,index标记小孩索引

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        int count = 0;
        Arrays.sort(g);
        Arrays.sort(s);
        int index = 0;
        for(int i=0;i<s.length;i++){
            if(index<g.length && s[i]>=g[index]){
                ++count;      
                ++index;   
            }
        }
        return count;
    }
}

这里发现不管那种思路,都需要先对数组进行排序。
利用指针可以减少for循环的使用。

posted @ 2021-06-30 11:13  rananie  阅读(27)  评论(0编辑  收藏  举报