605 种花问题
思路1:
实际上可以用2标记当前为1的元素的左右元素,找最长的连续为0的区域[a,b],然后用 f l o o r ( b − a + 1 2 ) + 1 floor(\frac{b-a+1}{2})+1 floor(2b−a+1)+1。
思路2:
我们每次碰到一个0分成3种情况讨论,
- 如果它已经是最后一个元素,
- 否则:
- 如果它后面存在一个1,则当前位置不能放花,下一个要考虑的位置是i+=3;
- 如果它后面元素为0,我们可以把它填上,下一个要考虑的位置i+=2;(因为当前位置是1)
每次碰到一个1时就往后跳2个元素。
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
int l = flowerbed.length;
int i=0;
while(i<l){
if(n==0)
return true;
if(flowerbed[i]==1)
i+=2;
// flowerbed[i]==0
else{
// 如果是最后一个格子为0
if(i==(l-1)){
n--; //这个格子可以种树
i++;
}
else{
// 如果不是最后一个格子,则我们看看看它之后的那个格子如果不是1就可以种植
if(flowerbed[i+1]!=1){
n--;
i+=2; //因为当前格子为1了,所以往后跳两个格子
}
else
i+=3; //因为我们下一个格子是1,所以直接跳到1右边的第二个格子。
}
}
}
if(n==0)
return true;
else
return false;
}
}