2021-01-01 605
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;
}
}