Google 面试题 | 分饼干

专栏 | 九章算法
网址 | www.jiuzhang.comgit

题目描述程序员

假设你有一群孩子和一些饼干,每一块饼干j大小为s(j),同时每个孩子i,被分到的饼干大小至少为g(i),即s(j)>=g(i)时,这个孩子才会知足,g(i)成为孩子i的知足度。你的目标是将饼干分配给孩子,使获得知足的孩子尽量多。保证每一个g(i)为正且不能将多块饼干分给一个孩子或将一块饼干分给多个孩子。面试

输出样例算法

样例1:
输入: [1,2,3], [1,1]
输出: 1
说明: 三个孩子的知足度分别为1,2,3,两块饼干的大小均为1。饼干的大小为1,只能知足第一个孩子,因此输出1。微信

样例2:
输入: [1,2], [1,2,3]
输出: 2
说明: 两个孩子的知足度分别为1,2,三块饼干的大小分别为1,2,3。这三块饼干的大小足以知足这两个孩子,因此输出2。框架

解题思路分析学习

1. 分析
直觉上,要使知足的孩子尽量多,分配给每一个孩子的饼干应该尽量小。若是把大的饼干分配给知足度较小的孩子,显然会形成浪费。这样,咱们能够按g(i)从小到大给孩子分配饼干,同时,为了避免浪费饼干,对于要分配给某个孩子的饼干,也从剩下的饼干中找到最小的能知足这个孩子的饼干。按g(i)从小到大分配饼干的好处是,当把s(j)分配给g(i)以后,对于下一个孩子g(i+1),咱们就不用考虑s(j)以前的饼干了,只需考虑s(j)以后的饼干(这里假设g(i),s(i)为从小到大排列)。由于,若是s(j)以前还有能够知足g(i+1)的饼干,那这块饼干也必然能够知足g(i),那s(j)就不是剩余饼干中能够知足g(i)的最小的饼干了。ui

2. 实现
将g与s都从小到大排列,再用两根指针i,j,若是g(i)<=s(j),则将s(j)分配给g(i),再看下一个孩子与下一块饼干,i与j均自增;不然,应依次增大j去寻找能知足g(i)的s(j)。这种方法叫作two pointer。设孩子数与饼干数的较大值为n,则排序的时间复杂度为O(nlog(n)),两根指针的时间的复杂度为O(n),总的时间复杂度为O(nlog(n))。指针

3.证实
那么这样的贪心算法是正确的吗?是的。下面给出简单的分析。首先仍然假设g(i)已从小到大排序,因此g(0)为最小值。对于一个最优的方案(即能知足最多孩子的方案),假设这个方案里能知足的孩子中知足度最小的是g(i),而将s(j)分配给了g(i),那么有s(j)>=g(i)>=g(0),故咱们能够把g(i)换成g(0)而获得另外一个最优方案。把g(0)与s(j)从原问题中去掉,则获得了一个比原问题规模略小但形式相同的新问题。对于新问题的分析与原问题相同。这样,咱们就能够把原最优方案中的孩子依次替换成g(0),g(1),……,g(ans-1),ans为最优方案知足的孩子个数。所以,咱们总能够去先知足知足度最小的孩子来得到最优方案。code

4.实现
只要每次给出的饼干是能知足当前的孩子的最小的饼干,以什么样的顺序给孩子分配饼干实际上是无所谓的(若是不存在能知足当前孩子的饼干,则跳过这个孩子),最终的答案都是同样的。具体分析比较繁琐,这里再也不给出,感兴趣的读者能够试着从如下角度分析:对于一种孩子分配顺序,若是交换某对相邻两个孩子的顺序,会对最终结果形成怎样的影响。

5.Follow up
若是能够把多块饼干分给一个孩子,怎么作?

参考程序

面试官角度分析

此题的最优算法是贪心算法。若是能想到贪心算法并给出算法框架,就能够达到hire的程度。对于贪心算法的学习,能够参考的意见 以下 link:
还在浪费时间学贪心算法么?告诉你三个不须要学习贪心法的理由!

LintCode相关问题

www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…
www.lintcode.com/en/problem/…

九章官网参考代码连接:

www.jiuzhang.com/solutions/m…
www.jiuzhang.com/solutions/c…
www.jiuzhang.com/solutions/j…
www.jiuzhang.com/solutions/j…
www.jiuzhang.com/solutions/g…
www.jiuzhang.com/solutions/d…
www.jiuzhang.com/solutions/l…
www.jiuzhang.com/solutions/l…

推荐阅读:



欢迎关注个人微信公众号:九章算法(ninechapter)。
精英程序员交流社区,按期发布面试题、面试技巧、求职信息等

九章算法,IT教育领域的深耕者
相关文章
相关标签/搜索