假设你有一个很长的花坛,一部分地块种植了花,另外一部分却没有。但是,花卉不能种植在相邻的地块上,它们会争夺水源,二者都会死去。数组
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。可否在不打破种植规则的状况下种入 n 朵花?能则返回True,不能则返回False。spa
来源:力扣(LeetCode)
连接:https://leetcode-cn.com/problems/can-place-flowers
code
个人思路:blog
其实就是把数组里的n个0变成1,全部的1不能相邻,那么就要判断连续的0的个数。 leetcode
接下来须要研究长度为n的连0串可以种几朵花。class
注意:开头的连0串和末尾的连0串可能须要特殊考虑(边界状况)。容器
注意:须要考虑全0的状况,第一次提交就被这个坑了!!!!!!!!di
我本身推出的结论是:若是长度为n连0串在开头或者末尾,那么它最多支持种n/2朵花;若是在中间,那最多支持种(n-1)/2朵花。co
卧佛了,彩笔的我没想到防护思想,直接在两边加0就不用考虑边界状况了,这样每三个连续的0就能种一朵花,只要数出左右都是0的0元素个数就行。push
个人答案: bool canPlaceFlowers(vector<int>& flowerbed, int n) {
vector<int> continousZero;//存放全部连0串的长度的容器 int size=flowerbed.size(); int count=0;//连0的个数 int maxsize=0; for (int i = 0; i < size; ++i) { if (flowerbed.at(i)==0) count++; else { continousZero.push_back(count); count=0; } } continousZero.push_back(count);//要加这句话,否则以0结尾,最后一个连0串长度不会存入容器,并且能够区分有没有以1结尾。 for (int i = 0; i < continousZero.size(); ++i) { if (i==0||i==continousZero.size()-1) maxsize+=continousZero.at(i)/2; else maxsize+=(continousZero.at(i)-1)/2; }
if (flowerbed==vector<int>(size,0))//全0的状况的判断 { return (size+1)*0.5>=n; } return maxsize>=n; }