【小白爬Leetcode455】3.1 分发饼干 Assign Cookies

【小白爬Leetcode455】3.1 分发饼干 Assign Cookies


Leetcode 455 e s a y \color{#228B22}{esay} esay

点击进入原题链接:Leetcode455 分发饼干 Assign Cookies

题目

Description

Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie. Each child i has a greed factor gi, which is the minimum size of a cookie that the child will be content with; and each cookie j has a size sj. If sj>= gi, we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number.

Example1:
在这里插入图片描述
Example2:
在这里插入图片描述

中文描述

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

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

示例1:
在这里插入图片描述
示例2:
在这里插入图片描述

思路:贪心算法

首先,我们需要将孩子按照胃口大小、饼干按照大小进行升序排列,以便解决问题:

 std::sort(g.begin(),g.end(),less<int>()
 std::sort(s.begin(),s.end(),less<int>()

这里注意sort函数的规则:less()表示前面的数字小于后面的,因此是升序;
反之,greater()表示前面的数字大于后面的,因此是升序。

现在,我们得到了升序排列的孩子和饼干,这个问题可以从两个方向来入手:

  1. 从孩子的视角来看,从胃口最小的孩子先开始:对每一个孩子g,由小到大寻找能够满足他胃口的饼干s:如果当前的饼干s不能满足这个孩子的胃口,那么它肯定满足不了后面胃口更大的孩子,因此丢弃这个饼干{s_index++;};如果当前的饼干s能满足这个孩子的胃口,那么把这个饼干丢给这个孩子{s_index++;},并考虑下一个胃口更大的孩子{g_index++;}。当饼干或孩子中的一方考虑完了,此时被满足的孩子数g_index就是我们要求的答案;
  2. 从饼干的视角来看,从最小的饼干先开始:对于每一个饼干s,由小到大寻找它能够满足的孩子:如果当前的饼干s不能满足这个孩子的胃口,那么它肯定满足不了后面胃口更大的孩子,因此丢弃这个饼干{s_index++;};如果当前的饼干s能满足这个孩子的胃口,那么继续考虑下一个饼干{s_index++;},并考虑下一个胃口更大的孩子{g_index++;}

这两种思想都是合理的,体现在实现上也是一样的。

最后的代码也较为简洁:

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        std::sort(g.begin(),g.end(),less<int>());
        std::sort(s.begin(),s.end(),less<int>());
        int g_index = 0;
        int s_index = 0;
        while(g_index<g.size()&&s_index<s.size()){
            if(g[g_index]<=s[s_index]){
                g_index++;
            }
            s_index++;
        }
        return g_index;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值