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;
}
};
相關文章
- 135. 分發糖果
- LeetCode 分發糖果LeetCode
- LeetCode135. 分發糖果LeetCode
- LeetCode 1103[分糖果II]LeetCode
- 【LeetCode】貪心演算法–分發糖果(135)LeetCode演算法
- 575. 分糖果
- python演算法:分糖果Python演算法
- 發糖果
- 三分鐘看完「分糖果」演算法問題演算法
- 東華OJ 陣列競賽 分糖果陣列
- P8518 [IOI2021] 分糖果 題解
- 吃糖果的概率
- 分糖果 II(不是所有的轉都難,注意下標)
- 入門必讀:糖果,空投,擼羊毛都是什麼?
- 封裝與職責分離的開發思維封裝
- 糖果世界模式系統應用開發模式
- kedaOJ#P0764. 小可的糖果盒
- 可以獎勵幾個糖果
- 程式碼隨想錄演算法訓練營 | 134. 加油站,135. 分發糖果,860.檸檬水找零,406.根據身高重建佇列演算法佇列
- 程式碼隨想錄演算法訓練營第三十五天 | 1005.K次取反後最大化的陣列和 134.加油站 135.分發糖果演算法陣列
- 用導演思維中的分鏡手法談UI創作UI
- 評分卡模型的評分標準模型
- 涼宮春日的嘆息 [思維+二分]
- 教師節快樂|安全是必須滿分的答卷
- 利用 Python 引導孩子的計算機思維Python計算機
- [LeetCode] 135. CandyLeetCode
- 【新特性速遞】評分,評分,評分
- Python如何區分不同的語句塊?這些必須知道!Python
- 前端開發者必備思維前端
- # 3分鐘短文:Laravel路由註冊,你必須掌握的“動詞”!Laravel路由
- P8687 [藍橋杯 2019 省 A] 糖果
- 程式碼隨想錄演算法訓練營第二十九天| leetcode134. 加油站、leetcode135.分發糖果、leetcode860.檸檬水找零、leetcode406.根據身高重建佇列演算法LeetCode佇列
- 3分鐘看懂Python後端必須知道的Django的訊號機制!Python後端Django
- 牛逼程式設計師必須要掌握金字塔思維程式設計師
- Git中~你必須掌握的!Git
- SAP MM 啟用批次管理的物料,在分類檢視裡指派023型別分類不是必須的型別
- 【基本思維】關於會計科目、會計分錄中借與貸的理解
- 一維陣列:相鄰兩數求和陣列