
方法:贪心
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
//特判
if (n == 0) return true;
int len = flowerbed.length;
//只有一个地块
if (len == 1) {
//此时 n = 1
if (flowerbed[0] == 0) {
return true;
} else {
return false;
}
}
//至少有两个地块
for (int i = 0; i < len - 1; i++) {
if (flowerbed[i] == 0) {
if (i == 0) {
if (flowerbed[i + 1] == 0) {
flowerbed[i] = 1;
n--;
}
} else {
if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0) {
flowerbed[i] = 1;
n--;
}
}
}
}
//对右边界进行特判
if (flowerbed[len - 1] == 0 && flowerbed[len - 2] == 0) n--;
if (n <= 0) return true;
return false;
}
}
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
//特判
if (n == 0) return true;
int len = flowerbed.length;
for (int i = 0; i < len; i += 2) {
//如果flowerbed[i] == 1,
//下一个可以种花的位置为 i + 2
//如果flowerbed[i] == 0,判断是否能种花
if (flowerbed[i] == 0) {
//由于每次碰到1都是跳两个位置,并且flowerbed 中不存在相邻的两朵花
//如果最后的位置为0,那么前一位置必定为0,可以种花
//或者当前位置为0,下一个位置为0,也可以种花
if (i == len - 1 || flowerbed[i + 1] == 0) {
n--;
//如果当前位置为0,但下一个位置为1
//则跳到下一个位置,最后使得再跳两个位置
} else {
i++;
}
}
}
return n <= 0;
}
}