Problem
You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots.
Given an integer array flowerbed
containing 0
‘s and 1
‘s, where 0
means empty and 1
means not empty, and an integer n
, return if n
new flowers can be planted in the flowerbed
without violating the no-adjacent-flowers rule.
Example 1:
1 | Input: flowerbed = [1,0,0,0,1], n = 1 |
Example 2:
1 | Input: flowerbed = [1,0,0,0,1], n = 2 |
Constraints:
1 <= flowerbed.length <= 2 * 104
flowerbed[i]
is0
or1
.- There are no two adjacent flowers in
flowerbed
. 0 <= n <= flowerbed.length
Analysis
这道题给定了一个只包含01的数组,0代表空(可以放置),1代表已经占有(不可放置),然后再给出了待放置的花的数量n
,要求计算出,在花之间不能相邻的情况下,能不能把这些花都放进去。这个和House Robber系列的题目还有点不一样,因为题目给出的了数组中包含了1,所以并不是单纯地dp。
先来看最简单的一种情况,三个连续空位000
。按照题目的要求有两种放的方法,一是101
,二是010
。第一种方式的前提是前面和后面都是0(即必须是00000
->01010
),所以在头尾的情况要考虑清楚。这里可以做一个转化,把第一种情况统一到第二种中处理。做法是在首尾都加一个0,变成0000000
,在这种情况下放置的情况就是0101010
,这样就兼容了第二种的做法。
按照上面第二种的计算方式,如果有连续k
个空闲位置,那么中间最多可以放置花的数量是$(k - 1) /2$,按照这个公式,从头到尾遍历数组,找到连续的k
个空闲位置后就计算一下,最后统计出这个数组最多还能够放多少枝花,再和题目给出的n
相比即可。
Solution
遍历的时候下标是$[0, size]$,这是因为兼容处理最后一个位置是空闲位置的情况。如果最后一个位置也是空闲的话,当结束的时候还是需要计算一波。
Code
1 | class Solution { |
Summary
这道题目在算法层面上没有过多的内容,难度主要是把不同的情况整合起来。想这类题目我们不妨先找一个最简单的case去分析,然后通过冗余的方式去统一处理逻辑。这道题目的分享到这里,谢谢您的支持!