python|49-数组-分发饼干-LeetCode455(python)

  • 要坚持才可以的,懈怠了三个多月,不好的。
  • 题目描述
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。
注意:
你可以假设胃口值为正。
一个小朋友最多只能拥有一块饼干。
  • 示例
示例 1:
输入: [1,2,3], [1,1]输出: 1解释: 你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。 所以你应该输出1。

【python|49-数组-分发饼干-LeetCode455(python)】示例 2:
输入: [1,2], [1,2,3]输出: 2解释: 你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出2.

  • 解决思路一
首先就是自己的没能解决问题的思路,就是把饼干数组和孩子数组分别排序以后,依次比较第i个元素的大小,但是其实这种思路是存在问题的,因为当前饼干不满足当前孩子的需要的话,还可能有下一个饼干满足当前孩子需要,因为当前孩子的需要必然是将要遍历到的孩子序列中需求最小的一个,合理的思路肯定是从将要遍历的饼干序列中找到能满足当前孩子需要的一个,再继续往后遍历。
贴上自己失败的代码(虽然自己回头看都觉得稀里糊涂,但是好歹写了半小时,不想就这样让它消失,,,)
##如果最大的供应值都小于最小的需求值,那么必然不能满足任何一个要求 #if max(sort_s) < min (sort_g): #return 0 #else: #m = 0 #for i in range(0,len(s)): #if s[i] < g[0]: #i = i + 1 #m = i #else: #break #s = s[m:]#n = min(lg,len(s)) #for i in range(0,n): #if s[i] >= g[i]: #i = i + 1 #x = i #else: #break #return x

  • 解决思路二
评论里的解决方案,据说是贪心的思想,用尽量小的饼干去满足需求较小的孩子,因此先进行排序,然后对两个数组同时进行遍历,如果可以满足,则计数的可被满足的孩子数+1,不论能不能满足,在遍历进行的过程中,饼干一定是继续往后遍历的,因为它如果不能满足当前的,肯定也不能满足以后的。
class Solution(object): def findContentChildren(self, g, s): """ :type g: List[int] :type s: List[int] :rtype: int """ lg = len(g) ls = len(s) if ls == 0: return 0 child = 0 cookie = 0 #排序数组 sort_g = sorted(g) sort_s = sorted(s) #遍历两个数组 while child < len(g) and cookie < len(s) : #如果当前饼干可以满足当前孩子,则可被满足的孩子数+1 if sort_g[child] <= sort_s[cookie]: child += 1 #饼干用过一次就不能再用了,也就是说如果连当前孩子的要求也不能满足,自然也不能满足之后的孩子 cookie += 1 return child


    推荐阅读