贪心,思路:要判断一个位置是否可以种花,需要知道它前一个与后一个位置是否为零,为零可以种,不为零就不可以。其实就变成了三个连续的位置是否为零。再处理一下特例,长度为一与数组开头与结尾的。
为何开头两个位置为零,就一定要种到第一个位置呢?
比如:三个坑,肯定是 1 0 1,不可能是 0 1 0,四个坑不影响,五个坑,1 0 1 0 1最多。
当开头为一时最佳。
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int len = flowerbed.length, canPlaceFlowers = 0;
// 长度为一的情况
if (len == 1) {
if (flowerbed[0] == 0) return n <= 1;
return n == 0;
}
// 开头两个位置
if (flowerbed[0] == 0 && flowerbed[1] == 0) {
canPlaceFlowers++;
flowerbed[0] = 1;
}
// 结尾的两个位置
if (flowerbed[len - 1] == 0 && flowerbed[len - 2] == 0) {
canPlaceFlowers++;
flowerbed[len - 1] = 1;
}
// 三个连续的就可在中间种一朵花
for (int i = 2; i < len; i++) {
if (flowerbed[i - 2] == 0 && flowerbed[i - 1] == 0 && flowerbed[i] == 0) {
canPlaceFlowers++;
flowerbed[i - 1] = 1;
}
}
return canPlaceFlowers >= n;
}