Google 面試題 | 種花

九章演算法發表於2019-01-29

專欄 | 九章演算法
網址 | 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:證明該貪心演算法的正確性。證明貪心演算法的正確性一般分為兩部分:證明問題具有最優子結構(在這題中就是對於一個種植數量最多的最優種植方案,將方案中的一株花種下後得到新的花壇,方案除掉這株花之後得到到的剩餘的方案仍是對於新花壇來說的最優方案),以及證明每一步的貪心選擇一定屬於某個最優方案。

參考程式

www.jiuzhang.com/solution/ca…

面試官角度分析

此題屬於簡單的貪心題,解題思路也很直觀。給出正確的演算法即可hire。

lintcode相關問題

www.lintcode.com/zh-cn/probl…


推薦閱讀:



歡迎關注我的微信公眾號:九章演算法(ninechapter)。
精英程式設計師交流社群,定期釋出面試題、面試技巧、求職資訊等

九章演算法,IT教育領域的深耕者
九章演算法,IT教育領域的深耕者

相關文章