leetcode 135. 分發糖果 (相鄰的孩子中,評分高的必須糖果更多) 思維
class Solution {
public:
int candy(vector<int>& a) {
int n=a.size(),sum=0;
if(n<=1) return n;
sum=1;
//pre的用處就是假如[3,7]是下坡 pre的值就是之前3分配的高度,然後[4,7]小朋友分別對應0,-1,-2,-3 這些小朋友都要增加4個糖果, //然後假如pre不大於等於5(第四個小朋友分配了0+4=4 所以第三個要>=5)的話,也要多給第3個小朋友分配糖果
for(int i=0,pre=1;i<n-1;){
if(a[i+1]>a[i]){
int cnt=1;//第i個小朋友的糖果已經在之前的下坡或者等坡分配好了.
while(i<n-1&&a[i+1]>a[i]) ++cnt,sum+=cnt,++i;//i+1(i還沒++之前的i+1)需要分配的糖果是cnt
pre=cnt;//更新pre
continue;
}
if(a[i+1]<a[i]){//i->i+1 就是下坡了,i現在分配的糖果是pre個
int di=i,cnt=1;
while(i<n-1&&a[i+1]<a[i]) --cnt,sum+=cnt,++i;//i+1(i還沒++之前的i+1)需要分配的糖果是cnt
if(cnt<=0){
sum+=(i-di)*(1-cnt);//第[di+1,i]個每個人需要增加(1-cnt)個糖果
if(pre<1+1-cnt) sum+=1+1-cnt-pre;//多給第di個小朋友分配
}//下坡之後不會是下坡(否則while不會跳出來),所以不需要更新pre
continue;
}
if(a[i+1]==a[i]){//比如[1,5]等坡 那麼1是取原來的值,[2,5]都取1 然後5或許會被下坡更新(假如5緊跟一個下坡且1滿足不了)
while(i<n-1&&a[i+1]==a[i]) sum+=1,++i;
pre=1;//更新pre
continue;
}
}
return sum;
}
};
class Solution {
public:
int candy(vector<int>& a) {
int n=a.size(),sum=0;
if(n<=1) return n;
sum=1;cout<<"第0個小朋友有1個糖果"<<endl;
for(int i=0,pre=1;i<n-1;){
if(a[i+1]>a[i]){
cout<<i<<" --> "<<i+1<<"開始上坡了"<<endl;
int cnt=1;//第i個小朋友的糖果已經在之前的下坡分配好了.
while(i<n-1&&a[i+1]>a[i]){
++cnt,sum+=cnt;//i+1需要分配的糖果是cnt
cout<<"第"<<i+1<<"個小朋友有"<<cnt<<"個糖果"<<endl;
++i;
}
pre=cnt;
continue;
}
if(a[i+1]<a[i]){//i->i+1 就是下坡了,i現在分配的糖果是pre個
cout<<i<<" --> "<<i+1<<"開始下坡了"<<endl;
int di=i,cnt=1;
while(i<n-1&&a[i+1]<a[i]){
--cnt,sum+=cnt;//第i+1個小朋友分配cnt個
cout<<"第"<<i+1<<"個小朋友有"<<cnt<<"個糖果"<<endl;//可見第di+1以及往後分配是從0開始減的
++i;
}
if(cnt<=0){
sum+=(i-di)*(1-cnt);//第[di+1,i]個每個人需要增加(1-cnt)個糖果
cout<<"第["<<di+1<<","<<i<<"]個小朋友每個人需要增加"<<1-cnt<<"個糖果"<<endl;
if(pre<1+1-cnt) {
//上面di+1及以後從0開始減 這裡的di取得就是1 本來應該是(1+1-cnt)的結果前面取了pre個 所以要增加
sum+=1+1-cnt-pre;
cout<<"第"<<di<<"個小朋友需要增加"<<1+1-cnt-pre<<"個糖果"<<endl;
}
}
continue;
}
if(a[i+1]==a[i]){
cout<<i<<" --> "<<i+1<<"開始等坡了"<<endl;
while(i<n-1&&a[i+1]==a[i]){
sum+=1;
cout<<"第"<<i+1<<"個小朋友有"<<1<<"個糖果"<<endl;
++i;
}
pre=1;
continue;
}
}
return sum;
}
};
相關文章
- LeetCode 分發糖果LeetCode
- 【LeetCode】貪心演算法–分發糖果(135)LeetCode演算法
- 三分鐘看完「分糖果」演算法問題演算法
- 東華OJ 陣列競賽 分糖果陣列
- (動態規劃)最小分糖果問題動態規劃
- 入門必讀:糖果,空投,擼羊毛都是什麼?
- 糖果世界模式系統應用開發模式
- solr 相關度評分,自定義評分Solr
- 封裝與職責分離的開發思維封裝
- 演算法提高 拿糖果演算法
- 可以獎勵幾個糖果
- 糖果單詞 7.13 exalt, humble, modest
- 糖果;及子串查詢分析
- 拷貝連結串列;及糖果分析
- 評分卡模型的評分標準模型
- 【新特性速遞】評分,評分,評分
- 利用 Python 引導孩子的計算機思維Python計算機
- AI在用|ChatGPT、Claude 3助攻,1分鐘GET高顏值思維導圖AIChatGPT
- King連發兩款“糖果”IP新遊戲,成功前景幾何?遊戲
- Python如何區分不同的語句塊?這些必須知道!Python
- # 3分鐘短文:Laravel路由註冊,你必須掌握的“動詞”!Laravel路由
- 牛逼程式設計師必須要掌握金字塔思維程式設計師
- Git中~你必須掌握的!Git
- [Leetcode] Maximum Gap 相鄰最大差值LeetCode
- 一維陣列:相鄰兩數求和陣列
- 以api文件為中心--前後端分開發離新思維API後端
- 基於thinkphp5.0.9一款糖果色非常漂亮的的後臺CMSPHP
- 前端開發者必備思維前端
- 3分鐘看懂Python後端必須知道的Django的訊號機制!Python後端Django
- Alien Skin Eye Candy 7 for Mac(PS眼睛糖果濾鏡)Mac
- P8687 [藍橋杯 2019 省 A] 糖果
- CSS中那些必須掌握的概念CSS
- 軟考評測師/中級軟考/測試基礎相關思維導圖
- sed、awk——運維必須掌握的兩個工具運維
- 刪除字串中的所有相鄰重複項字串
- 34天【程式碼隨想錄演算法訓練營34期】第八章 貪心演算法 part03 (● 1005.K次取反後最大化的陣列和 ● 134. 加油站 ● 135. 分發糖果 )演算法陣列
- SAP MM 啟用批次管理的物料,在分類檢視裡指派023型別分類不是必須的型別
- 如何在短頻快的節奏中做好技術?業務開發必會的架構思維架構