leetcode 455 分发饼干(c++和python) 贪心算法

目录

1 贪心算法:

2 题目描述

3 解题思路

4 c++

5 python


1 贪心算法:

保证每次局部操作是最优解,从而是最终得到的结果是全局最优解。

2 题目描述

有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃
一个饼干,且只有饼干的大小不小于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子
可以吃饱。

输入输出样例
输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数
量。
Input: [1,2], [1,2,3]
Output: 2

3 解题思路

每次用最小的饼干,分配给最不饿的小孩,达到资源的最大利用率,贪心策略是:给剩余孩子里面最小饥饿度的孩子分配最小的能饱腹的饼干。

具体步骤:

  1. 从小到大排序孩子和饼干;
  2. 两个指针遍历孩子和饼干,满足了孩子,则孩子指针和饼干指针都往后,不满足,则饼干指针往后找更大饼干。

4 c++

执行用时:20 ms, 在所有 C++ 提交中击败了95.87%的用户

内存消耗:17 MB, 在所有 C++ 提交中击败了91.29%的用户

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        
        // 排序
        sort(g.begin(), g.end());  // 逆序rbegin()
        sort(s.begin(), s.end());

        // 遍历孩子和饼干
        // 两个指针分别指针有序的孩子和有序的饼干
        int child_idx = 0;
        int cooky_idx = 0;
        while (child_idx < g.size() && cooky_idx < s.size())
        {
            if (g[child_idx] <= s[cooky_idx])  // 当前孩子的胃口小于当前的饼干大小
            {
                child_idx++;  // 下一个孩子
                cooky_idx++; // 下一饼干
            }
            else  // 饼干小了
            {
                cooky_idx++; // 找更大饼干
            }
        }
        return child_idx;
    }
};

5 python

执行用时:36 ms, 在所有 Python 提交中击败了82.72%的用户

内存消耗:13.9 MB, 在所有 Python 提交中击败了84.74%的用户

class Solution(object):
    def findContentChildren(self, g, s):
        """
        :type g: List[int]
        :type s: List[int]
        :rtype: int
        """
        # 排序
        g = sorted(g)
        s = sorted(s)

        # 两个指针,分别指向有序孩子,和有序饼干
        child_idx = 0   
        cooky_idx = 0  
        # 遍历孩子和饼干,满足了孩子,则孩子指针和饼干指针都往后,不满足,则饼干指针往后找更大饼干。
        while child_idx < len(g) and cooky_idx < len(s):  
            if g[child_idx] <= s[cooky_idx]:
                child_idx += 1  # 分配,下一个孩子
                cooky_idx += 1  # 下一个饼干
            else:
                cooky_idx += 1  # 找更大饼干
        # 要么孩子遍历完了,则全部吃饱,要么饼干分配完了。
        return child_idx

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值