0
点赞
收藏
分享

微信扫一扫

【Leetcode】贪心算法-分配问题-455


>​​0️⃣python数据结构与算法学习路线​​ >学习内容:
>- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等...
>- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等...

贪心算法分配问题思想:

贪心算法每一步必须满足以下条件:
  1、可行的:即它必须满足问题的约束。
  2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。
  3、不可更改:即选择一旦做出,在算法的后面步骤就不可改变了。

最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。

贪心算法与动态规划的区别:

  • 贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。
  • 贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。
  • 能用贪心解决的问题,也可以用动态规划解决

​​视频教程​​

题目:


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


输入输出:


输入: g = [1,2,3], s = [1,1]
输出: 1

解题思路:

1.给饥饿度最小的孩子👧吃最少的饱腹饼干🍪

2.给饥饿度最大的孩子👧吃最多的饱腹饼干🍪

算法实现:

class Solution(object):
def findContentChildren(self, g, s):
g.sort()
s.sort()
# list.sort(key=None,reverse=False)列表的排序,排之后赋值给前面,默认为升序排序
#n = 0 #满足的孩子数量,其实是和i一样
i = 0 #g胃口的列表
j = 0 #s饼干大小的列表
while i<len(g) and j<len(s):
#从零开始所以只能<不能<=
#while - and - 而不是 while - &&-
if g[i] <= s[j]:
i+=1
j+=1
else:
j+=1
return n

改进:

class Solution(object):
def findContentChildren(self, g, s):
g.sort()
s.sort()
# list.sort(key=None,reverse=False)列表的排序,排之后赋值给前面,默认为升序排序
i = 0 #g胃口的列表
j = 0 #s饼干大小的列表
lg = len(g)
#ls = len(s)
#while i<lg and j<ls:
#从零开始所以只能<不能<=
for j in s:
if i == lg:
break
if g[i] <= j:
i+=1
j+=1
return i

出现问题:

1.sort和sorted区别

sorted(data, cmp=None, key=None, reverse=False)  

sorted返回一个新的list,sort在原list基础上进行修改

sorted可以对任意iterable排序,sort只能对list排序

python2.4之后,list.sort和sorted都添加了一个key参数用来指定一个函数,这个函数作用于每个list元素,在做cmp之前调用

key参数是一个函数,这个函数有一个参数,返回一个用来排序的关键字

举报

相关推荐

0 条评论