专栏名称: 九章算法
专业的北美IT求职经验分享、技术交流社区,帮助你找到好的IT工作。由硅谷顶尖IT企业工程师维护。提供专业的算法培训/面试咨询,官网 www.jiuzhang.com
目录
相关文章推荐
九章算法  ·  2025大厂算法考点解析来了!FAANG大佬 ... ·  1 周前  
算法爱好者  ·  偷偷浏览小网站,被蜀黍问候了。。。 ·  1 周前  
九章算法  ·  阻断裁员潮!Meta开启疯招模式! ·  1 周前  
九章算法  ·  跳槽至少要涨多少钱? ·  1 周前  
九章算法  ·  码农又一大“敛财”方向,快追! ·  1 周前  
51好读  ›  专栏  ›  九章算法

Google 面试题 | 种花

九章算法  · 公众号  · 算法  · 2017-08-29 07:10

正文


作者 | Ben助教+ 施助教

编辑 | Freya

专栏 | 九章算法



1
题目描述


一个长条花坛里有若干并排的花槽,有些花槽中已经种了花,有些则还没种花。然而,不能将两株花种在相邻的花槽否则它们会争夺水分导致两者都枯萎。给定一个花坛的种植情况flowerbed(一个包含0和1的数组,0表示该花槽为空,1表示该花槽已经种了花),以及一个数n,问是否可以再种下新的n株花且满足相邻花槽不能同时种花的条件。


2
样例


样例 1

输入: flowerbed = [1,0,0,0,1], n = 1

输出: True

样例 2

输入: flowerbed = [1,0,0,0,1], n = 2

输出: False

注意

输入数组本身满足相邻花槽不同时种花的条件。

输入数组的长度范围为[1, 20000]。

n是非负整数且大小不会超过输入数组的长度。


3
解题思路分析


a. 为了尽可能的多种点花,应该使花种得尽量的密集。可以使用贪心的方法种花:从左往右扫描花槽,每遇到一个满足条件可以种植的花槽(前后花槽都为空或者为边界),就在这个位置种花,看能种下的花的数量是否大于等于n,是则返回true,否则返回false。一个小优化是当计数计到n时即可直接返回true。算法时间复杂度为O(n),额外空间复杂度为O(1)。


b. Follow up:证明该贪心算法的正确性。证明贪心算法的正确性一般分为两部分:证明问题具有最优子结构(在这题中就是对于一个种植数量最多的最优种植方案,将方案中的一株花种下后得到新的花坛,方案除掉这株花之后得到到的剩余的方案仍是对于新花坛来说的最优方案),以及证明每一步的贪心选择一定属于某个最优方案。


4
参考程序


http://www.jiuzhang.com/solution/can-place-flowers/


5
面试官角度分析


此题属于简单的贪心题,解题思路也很直观。给出正确的算法即可hire。


6
lintcode相关问题


http://www.lintcode.com/zh-cn/problem/house-robber/



九章算法 | IT 高阶精英求职教育平台


《九章算法班》

《系统设计班》

《Big Data 项目实战班》

《算法面试高频题班》

《Java入门与基础算法班》


正在报名中!

报名登陆官网 www.jiuzhang.com

或点击文末“阅读原文”