假設你有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有,可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去,
給定一個花壇(表示為一個陣列包含0和1,其中0表示沒種植花,1表示種植了花),和一個數 n ,能否在不打破種植規則的情況下種入 n 朵花?能則回傳True,不能則回傳False,
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/can-place-flowers
我的思路:
其實就是把陣列里的n個0變成1,所有的1不能相鄰,那么就要判斷連續的0的個數,
接下來需要研究長度為n的連0串能夠種幾朵花,
注意:開頭的連0串和末尾的連0串可能需要特殊考慮(邊界情況),
注意:需要考慮全0的情況,第一次提交就被這個坑了!!!!!!!!
我自己推出的結論是:如果長度為n連0串在開頭或者末尾,那么它最多支持種n/2朵花;如果在中間,那最多支持種(n-1)/2朵花,
臥佛了,彩筆的我沒想到防御思想,直接在兩邊加0就不用考慮邊界情況了,這樣每三個連續的0就能種一朵花,只要數出左右都是0的0元素個數就行,
我的答案: 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; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/172090.html
標籤:C++
上一篇:學習第51天
