每日一題——種花問題

假設你有一個很長的花壇,一部分地塊種植了花,另外一部分卻沒有。但是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,二者都會死去。數組

給定一個花壇(表示爲一個數組包含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; }
相關文章
相關標籤/搜索