题意:分发糖果,要求具有更大rating的人比他相邻的具有更小rating的人的糖果数多。求最少要分给这些人多少个。
rating:4,3,1,2,5
糖果:3,2,1,2,3
通过分析可知,比两个邻居ratings都小的人要分1个(包括了最左边的人和最右边的人),其余的人糖果数为邻居中比他rating小的人的糖果数+1。
因为在遍历时,可能分发的糖果数依赖于其他节点,所以可采用递归求解。
class Solution {
public:
int* val,n;
vector<int>*vt;
int dfs(int u){
if(u<0||u>=n)return 0;
if(val[u]!=0)return val[u];
if((u==0&&(*vt)[u]<(*vt)[u+1])||(u==n-1&&(*vt)[u]<(*vt)[u-1])||(u<n&&u>0&&(*vt)[u]<(*vt)[u+1]&&(*vt)[u]<(*vt)[u-1]))
val[u]=1;
else{
if(u<n&&(*vt)[u]>(*vt)[u+1])
val[u]=dfs(u+1);
if(u>0&&(*vt)[u]>(*vt)[u-1])
val[u]=max(val[u],dfs(u-1));
val[u]++;
}
return val[u];
}
int candy(vector<int> &rt) {
n=rt.size();
if(n==1)return 1;
val=new int[n];
vt=&rt;
memset(val,0,sizeof(int)*n);
int i;
for(i=0;i<n;++i){
if(val[i]==0){
dfs(i);
}
}
int ans=0;
for(i=0;i<n;++i)
ans+=val[i];
delete[]val;
return ans;
}
};
844

被折叠的 条评论
为什么被折叠?



