605.花を置くことができます
タイトル説明
非常に長い花壇があり、区画の一部に花が植えられているが、他の部分には花が植えられていないとします。しかし、隣接する区画に花を植えることはできず、水を奪い合い、両方とも死んでしまいます。
花壇を表す整数配列の花壇を与えます。これは、0と1の数で構成されます。ここで、0は花が植えられていないことを意味し、1は花が植えられていることを意味します。別の数nがあります。植え付け規則に違反せずにn個の花を植えることはできますか?可能な場合はtrueを返し、できない場合はfalseを返します。
例1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
例2:
输入:flowerbed = [1,0,0,0,1], n = 2
输出:false
促す:
1 <= flowerbed.length <= 2 * 104
flowerbed[i] 为 0 或 1
flowerbed 中不存在相邻的两朵花
0 <= n <= flowerbed.length
回答
配置:花壇に
植えられる花の最大数を解決するための貪欲な問題サブ問題:各0間隔の長さを解決し、間隔の長さに応じてサブ間隔に植えることができる花の数を計算します
数学的帰納法:
-
真ん中の0間隔の場合:
-
1〜2 0:0を植えることができます。
-
3〜4:1本植えることができます。
-
5〜6:2本植えることができます。
-
…
-
カウント:植えることができます(カウント-1)/ 2花
-
-
両端の0間隔では、左右に1の制限がないため、植えることができる花の数がわずかに異なります
+配列の左右に10を追加できます。つまり、花壇の左右に花はありません。
コード
class Solution {
public boolean canPlaceFlowers(int[] flowerbed, int n) {
// 贪心问题 求解花坛的最大种花数量
// 根据花坛中0的个数来计算
// 数学归纳:
// 1-2 0
// 3-4 1
// 5-6 2
// count = (count-1)/2
// 优化
if(flowerbed.length==0 || flowerbed == null ){
return n==0;
}
// 统计可以种花数目
int num = 0;
// 花坛总长度
// 计算0的个数 默认为1可以处理边界问题 补00操作
int countofzero = 1;
int length = flowerbed.length;
for(int i=0;i<length;i++){
if(flowerbed[i] == 0){
countofzero++;
}else{
//遇到1了 计算该区间种花的个数
num += (countofzero-1)/2;
countofzero = 0 ;
}
}
// 最后补0
countofzero++;
num += (countofzero-1)/2;
return num>=n;
}
}