leetcode -- 605. Can Place Flowers 【邊界處理 + 數學規律】
阿新 • • 發佈:2019-01-23
題目
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;
}