LeetCode刷题笔记(Assign Cookies)

从今天开始就进入了贪心算法的板块了,感觉贪心算法思考起来比动态规划要简单一些,下面就和大家分享一下刚刷的这道题。

题目如下:

题意分析:

给定一些大小尺寸不同的 cookie 和一群贪心指数不同的小朋友,当小朋友获得了 cookie 的大小不小于自己贪心指数时,小孩将会变得很开心,请问给定的 cookie 最多能让几个小朋友开心?

方法一(贪婪算法)

先对 g、s 两个数组按照从大到小进行排序,然后先尝试拿最大的 cookie 给贪心指数最大的小朋友,看能否让其开心,若可以则让 res 加1,同理再拿下一个 cookie 去满足下一位小朋友;若当前 cookie 不能让当前小朋友开心,那么就用当前 cookie 去尝试满足下一位小朋友。当 cookie 分配完或者没有小朋友可以分配时,停止遍历并返回 res。

解题代码如下:

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort( g.begin(), g.end(), greater<int>() );
        sort( s.begin(), s.end(), greater<int>() );
        int res = 0;

        for ( int i = 0, j = 0; i < s.size() && j < g.size();  ) {
            if ( s[i] >= g[j] ) {
                res++;
                i++;
                j++;
            }
            else
                j++;
        }
     return res;
    }
};

提交后的结果如下: 

 

方法二(方法一的优化)

由于是拿 cookie 去满足小孩,所以用了的 cookie 都应该是让小孩开心了的,所以 cookie 数就是开心的小孩个数,故用一个全局变量 i 去记录 cookie 数即可。

解题代码如下:

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort( g.begin(), g.end(), greater<int>() );
        sort( s.begin(), s.end(), greater<int>() );
        int i = 0;

        for ( int j = 0; i < s.size() && j < g.size(); j++ ) {
            //由于是拿cookie去满足小孩,所以用了的cookie都应该是让小孩开心了的,所以cookie数就是开心的小孩个数
            if ( s[i] >= g[j] ) i++;
        }

        return i;
    }
};

提交后的结果如下: 

 

 

 

日积月累,与君共进,增增小结,未完待续。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值