分发饼干
题目描述:
解题思路:
- 第一种:贪心算法简陋版。我们可以先将这两个列表进行排序,然后同时从头开始遍历查找,优先满足那些数字小的,也就是胃口更小的小朋友,所以从小到大,只要存在
s
中有大于等于g
的元素,说明这个元素就可以满足条件,就给child_number
加一,然后将数组s
用切片方法截去j
元素及之前的元素。方法比较暴力,所以时间复杂度比较大。 - 时间复杂度:O(NM)
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
child_number = 0
s.sort()
g.sort()
for i in g:
for j in s:
if i <= j:
child_number += 1
s = s[s.index(j)+1:]
break
return child_number
- 第二种:贪心算法升级版。我们接下来对上面第一种方法进行优化改进,这里我们跟上面一样也先是要将这两个列表进行顺序排序,然后定义吃了饼干孩子的数目和饼干的数目,这里可以看作是双指针分别在
g
和s
列表中,只要满足孩子胃口值小于饼干尺寸,就说明这个孩子可以被满足,child_number
就加一,因为每次分配,无论饼干吃或被吃,都要判断下一个饼干的尺寸,所以饼干数目也要加一。 - 时间复杂度:O(NlogN)
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
g.sort()
s.sort()
child_number = 0
biscuits_number = 0
while child_number < len(g) and biscuits_number < len(s):
if g[child_number] <= s[biscuits_number]:
child_number += 1
biscuits_number += 1
return child_number