贪心算法 2. 分发饼干

贪心算法 2. 分发饼干

455. 分发饼干 - 力扣(LeetCode)

代码随想录

难度 3 - 简单

  • 策略:从前向后

    • 从小到大排序孩子胃口和饼干大小
    • 两个列表都从头开始遍历
    • 当前饼干优先满足当前孩子(小饼干先喂饱小胃口)
    • 但是如果当前孩子胃口>当前饼干,说明当前的小饼干已经无法满足当前以及后续所有任意的孩子,所以需要单独更新饼干指针,指向更大的饼干
  • 代码:

    class Solution:
        def findContentChildren(self, g: List[int], s: List[int]) -> int:
            # 每个孩子最多只能给一块饼干!
            # if len(s) == 0:
            #     return 0
    
            g.sort()
            s.sort()
    
            count = 0
            i = 0 # 指向孩子
            j = 0 # 指向饼干
            while i < len(g) and j < len(s):
                if g[i] <= s[j]: # 当前孩子胃口<=当前饼干时,给饼干
                    i += 1
                    j += 1
                    count += 1
                else: # 当前孩子胃口>当前饼干时,小饼干已经无法满足当前以及后续的孩子,所以指向更大饼干
                    j += 1 # 指向下一个更大的饼干
            return count
    
  • 另一种从后向前的策略也可以(摘自代码随想录):

    • 为了满足更多的小孩,就不要造成饼干尺寸的浪费。
    • 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。
    • 这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩
    • 可以尝试使用贪心策略,先将饼干数组和小孩数组排序。
    • 然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
  • 代码:

    class Solution:
        def findContentChildren(self, g, s):
            g.sort()  # 将孩子的贪心因子排序
            s.sort()  # 将饼干的尺寸排序
            index = len(s) - 1  # 饼干数组的下标,从最后一个饼干开始
            result = 0  # 满足孩子的数量
            for i in range(len(g)-1, -1, -1):  # 遍历胃口,从最后一个孩子开始
                if index >= 0 and s[index] >= g[i]:  # 遍历饼干
                    result += 1
                    index -= 1
            return result
    
  • 时间复杂度:O(nlogn)

  • 空间复杂度:O(1)

想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心

你可能感兴趣的:(小白的代码随想录刷题笔记,Mophead的小白刷题笔记,leetcode,python,代码随想录,贪心算法)