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, 20000]。
n 是非負整數,且不會超過輸入陣列的大小。
基本思路:貪心演算法,儘可能多的插花,那麼在兩個已經種花[i,j]區間之間,其中,i,j已經可以種花,其他都是沒有種花,最多可以種多少花?
- 真正可以種花的區間是[i+2,j-2],有效區間長度為區間長度len=j-i-3,最多可以種(len+1)/2個花
- 對於起點[0,i],在i位置上種花,有效區間長度[0,i-2],其長度為len=i-1,最多可以種(len+1)/2個花
- 對於終點[j,size-1],在j位置上種花,有效區間長度為[j+2,size-1],其長度len=flowerbed.size()-j-2,最多可以種(len+1)/2個花
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int cnt=0;
int pre=-1;
for(int i=0;i<flowerbed.size();i++){
if(flowerbed[i]==1){
if(pre<0){
cnt+=i/2;
}
else{
cnt+=(i-pre-2)/2;
}
pre=i;
}
if(cnt>=n)
return true;
}
if(pre<0){
cnt=(flowerbed.size()+1)/2;
}
else if(flowerbed.size()>pre+1){
cnt+=(flowerbed.size()-1-pre)/2;
}
return cnt>=n;
}
基本思路:思考那種情況可以種花
- 0|0|0,即當前節點的左右都為空
- 左邊界|0|0,即當前節點為0
- 0|0|右邊界,即當前節點為flowerbed.size()-1;
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int i=0;
while(i<flowerbed.size()&&n>0){
if(flowerbed[i]==1){
i+=2;
}
else if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)&&(i==flowerbed.size()-1||flowerbed[i+1]==0)){
n--;
i+=2;
}
else
i+=3;
}
return n<=0;
}
基本思路:對上述方法的改進,當前為1或者可以種花的情況下,直接跳到i+2,因為i+1必然為零,否則的話,直接跳到i+3,因為下一個必然為1.
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int i=0;
while(i<flowerbed.size()&&n>0){
if(flowerbed[i]==1){
i+=2;
}
else if(i==flowerbed.size()-1||flowerbed[i+1]==0){
n--;
i+=2;
}
else
i+=3;
}
return n<=0;
}
相關文章
- Google 面試題 | 種花Go面試題
- RMQ問題的各種解法MQ
- javascript中的各種問題JavaScript
- ArchLinux各種問題彙總Linux
- 關於各種揹包問題
- N皇后問題(各種優化)優化
- 各種測試方法的問題
- 被騰訊問蒙的各種Redis複雜問題Redis
- 為什麼會有公司花1000萬請麥肯錫解決問題?
- 解決代理超時問題的三種方法
- 前端基礎問題:CSS居中的幾種方式前端CSS
- 解決ajax跨域問題的多種方法跨域
- 完美解決jspdf各種中文亂碼問題JS
- 【SpringMVC】解決跨域問題的兩種方式SpringMVC跨域
- Python——畫一棵漂亮的櫻花樹(不同種櫻花+玫瑰+聖誕樹喔)Python
- 動態規劃 擺花 題解動態規劃
- 8 種方案解決重複提交問題!你選擇哪一種呀?
- 種題問由型把按常低界命sxz
- 如何解決重要資料檔案各種問題?
- Spring Boot幾種啟動問題的解決方案Spring Boot
- Python 機器學習 HMM模型三種經典問題Python機器學習HMM模型
- 解決ASP.NET中的各種亂碼問題ASP.NET
- 關於開啟軟體提示各種缺少dll問題
- 洛谷題單指南-數學基礎問題-P2660 zzc 種田
- InMyArea:研究顯示47%的僱員自己花錢解決在家工作的技術問題
- flashfxp 亂碼,2種辦法解決flashfxp 亂碼問題
- 幾種解決“藍芽不可用”問題的辦法藍芽
- 執行 NPM run watch-poll 各種報錯問題整理NPM
- 【動態規劃】一次搞定三種揹包問題動態規劃
- Netty解決粘包和拆包問題的四種方案Netty
- 九種 “姿勢” 讓你徹底解決跨域問題跨域
- 問題 C: 百雞問題
- 【問題】Nacos 使用問題整理
- 什麼是P問題、NP問題和NPC問題
- 錦上添花!改善資料視覺化的 8 種方法視覺化
- 博基計劃(3)---P問題、NP問題、NPC問題、NP-hard問題
- 各種二埠濾波器網路模擬遇到的問題
- 交流學習SAP ERP的各種問題和方法,如何快速入行?