专栏 | 九章算法
网址 | www.jiuzhang.com
题目描述
一个长条花坛里有若干并排的花槽,有些花槽中已经种了花,有些则还没种花。然而,不能将两株花种在相邻的花槽否则它们会争夺水分导致两者都枯萎。给定一个花坛的种植情况flowerbed(一个包含0和1的数组,0表示该花槽为空,1表示该花槽已经种了花),以及一个数n,问是否可以再种下新的n株花且满足相邻花槽不能同时种花的条件。
样例
样例 1
输入: flowerbed = [1,0,0,0,1], n = 1
输出: True
样例 2
输入: flowerbed = [1,0,0,0,1], n = 2
输出: False
注意
输入数组本身满足相邻花槽不同时种花的条件。
输入数组的长度范围为[1, 20000]。
n是非负整数且大小不会超过输入数组的长度。
解题思路分析
a. 为了尽可能的多种点花,应该使花种得尽量的密集。可以使用贪心的方法种花:从左往右扫描花槽,每遇到一个满足条件可以种植的花槽(前后花槽都为空或者为边界),就在这个位置种花,看能种下的花的数量是否大于等于n,是则返回true,否则返回false。一个小优化是当计数计到n时即可直接返回true。算法时间复杂度为O(n),额外空间复杂度为O(1)。
b. Follow up:证明该贪心算法的正确性。证明贪心算法的正确性一般分为两部分:证明问题具有最优子结构(在这题中就是对于一个种植数量最多的最优种植方案,将方案中的一株花种下后得到新的花坛,方案除掉这株花之后得到到的剩余的方案仍是对于新花坛来说的最优方案),以及证明每一步的贪心选择一定属于某个最优方案。
参考程序
面试官角度分析
此题属于简单的贪心题,解题思路也很直观。给出正确的算法即可hire。
lintcode相关问题
推荐阅读:
- 网申时, 是否需要 cover letter (求职信) ?
- 2017年最受欢迎的编程语言有哪些?
- HR 揭秘: 10 个挂掉 Offer 的原因
- Google offer 如何谈判?听听 Google recruiter 怎么说!
- 面试遇到做过的题怎么办?
- Snapchat 面经 | LA 总部面试体验
- 面试前如何了解一家IT企业?试试官方技术博客!
- 互联网历史上最有创意的 7 份简历
- 利用 Twitter 找工作 | 如何寻找招聘信息
- Facebook 电面+Onsite面经
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等
