题目
Suppose 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 - they would compete for water and both would die.
Given a flowerbed (represented as an array containing 0 and 1, where 0 means empty and 1 means not empty), and a number n, return if n new flowers can be planted in it without violating the no-adjacent-flowers rule.
Example 1:
Input: flowerbed = [1,0,0,0,1], n = 1
Output: True
Example 2:
Input: flowerbed = [1,0,0,0,1], n = 2
Output: False
Note:
- The input array won't violate no-adjacent-flowers rule.
- The input array size is in the range of [1, 20000].
- n is a non-negative integer which won't exceed the input array size.
题意
种花,两个花不能相邻(因竞争而死),给定一定的花床,判断其是否仍然可种下给定数量的花。
解法1:(暴力方法)
- 【判断可种的规则】对于介于 0 和( 数组长度-1)之间的元素,判定规则需考虑:元素自身,元素的左右。
- 【边界规则】针对0,没有左元素。
- 【边界规则】针对( 数组长度-1),没有右有元素。
public class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
if(flowerbed.length == 1){
if(flowerbed[0] == 0){
n--;
}
return n <= 0;
}
for(int i = 0;i < flowerbed.length;i++){
if(i == 0){
if(!(flowerbed[i] ==1) && !(flowerbed[i+1] == 1)){
flowerbed[i] = 1;
n--;
}
continue;
}
if(i == flowerbed.length -1){
if(!(flowerbed[i] ==1) && !(flowerbed[i-1] == 1)){
flowerbed[i] = 1;
n--;
}
continue;
}
if(!(flowerbed[i] ==1) && !(flowerbed[i-1] == 1) && !(flowerbed[i+1] == 1)){
flowerbed[i] = 1;
n--;
}
}
return n <= 0;
}
}
解法2:(利用数学规律)
- 【统计连续空地】使用count来进行统计。
- 【统计连续空地上可种】(count -1) / 2
- 【特殊处理 + 最后一个count】 count / 2
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int count = 1;
int result = 0;
for(int i=0; i<flowerbed.length; i++) {
if(flowerbed[i] == 0) {
count++;
}else {
result += (count-1)/2;
count = 0;
}
}
if(count != 0) result += count/2;
return result>=n;
}