Leetcode 贪心算法 455. 分发饼干

455.分发饼⼲
题⽬链接:https://leetcode-cn.com/problems/assign-cookies/
假设你是⼀位很棒的家⻓,想要给你的孩⼦们⼀些⼩饼⼲。但是,每个孩⼦最多只能给⼀块饼⼲。
对每个孩⼦ i,都有⼀个胃⼝值 g[i],这是能让孩⼦们满⾜胃⼝的饼⼲的最⼩尺⼨;并且每块饼⼲ j,都
有⼀个尺⼨ s[j] 。如果 s[j] >= g[i],我们可以将这个饼⼲ j 分配给孩⼦ i ,这个孩⼦会得到满⾜。你的⽬
标是尽可能满⾜越多数量的孩⼦,并输出这个最⼤数值。
示例 1:
输⼊: g = [1,2,3], s = [1,1]
输出: 1
解释:
你有三个孩⼦和两块⼩饼⼲,3个孩⼦的胃⼝值分别是:1,2,3。
虽然你有两块⼩饼⼲,由于他们的尺⼨都是1,你只能让胃⼝值是1的孩⼦满⾜。
所以你应该输出1。
示例 2:
输⼊: g = [1,2], s = [1,2,3]
输出: 2
解释:
你有两个孩⼦和三块⼩饼⼲,2个孩⼦的胃⼝值分别是1,2。
你拥有的饼⼲数量和尺⼨都⾜以让所有孩⼦满⾜。
所以你应该输出2.
提示:
1 <= g.length <= 3 * 10^4
0 <= s.length <= 3 * 10^4
1 <= g[i], s[j] <= 2^31 - 1

我的思路:
1.小孩找饼干,找到尺寸差不多的饼干直接吃掉

class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
bisxit=s
count=0
for i in range(0,len(g)):
for j in range(0,len(bisxit)):
if g[i]<=bisxit[j]:
count=count+1
bisxit[j]=-1
break
return count
#因为太久没用cpp了就用python
案例没过,考虑一下排序在这里插入图片描述
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
bisxit=s
g=sorted(g)
bisxit=sorted(bisxit)
count=0
for i in range(0,len(g)):
for j in range(0,len(bisxit)):
if g[i]<=bisxit[j]:
count=count+1
bisxit[j]=-1
break
return count在这里插入图片描述
确实慢啊确实慢,不过优化方向有两路:
1.别用python写(在写算法的时候我就用cpp了虽然很烂)
2.两个循环改一下,写成一个循环,另一个用数组?
答:class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
bisxit=s
g=sorted(g)
bisxit=sorted(bisxit)
count=0
bis=len(bisxit)-1
for i in range(len(g)-1,-1,-1):
if g[i]<=bisxit[bis]:
count=count+1
bis=bis-1
return count
大嘴巴找大饼干,大饼干被找到了直接退后一格
在这里插入图片描述
绿了绿了,继续
在这里插入图片描述
数组出界了很多地方,时间复杂度降为O(n),但空间复杂度没降

思考:为什么直接找会没有最优解?
我以为是定错位置了,将0改为-1但还是错误,所以可能是有个案例让小孩直接去找饼干没有最优,但是我只是刷题所以不用数学在探讨了

final:
class Solution:
def findContentChildren(self, g: List[int], s: List[int]) -> int:
bisxit=s
g=sorted(g)
bisxit=sorted(bisxit)
count=0
bis=len(bisxit)-1
if bis<0:
return count
else:
for i in range(len(g)-1,-1,-1):
if bis<0:
break
if g[i]<=bisxit[bis]:
count=count+1
bis=bis-1
return count

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值