博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】Candy(hard) 自己做出来了 但别人的更好
阅读量:6069 次
发布时间:2019-06-20

本文共 2406 字,大约阅读时间需要 8 分钟。

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

What is the minimum candies you must give?

 

注意,像 6 5 5 4 这样的 可以分 2 1 2 1 就是数字相同的不需要糖果数相同

我的思路,分别用两个vector存储递增和递减所需要的糖果,最终结果取两个的最大值

如 权重    6 6 1 5 4 4 3 7 4 2 2 2 5 4 3 5

找递增     1 1 1 2 1 1 1 2 1 1 1 1 2 1 1 2   从前向后找,初始都是1,遇到递增的就加上他前面查找的数字

找递减     1 2 1 2 1 2 1 3 2 1 1 1 3 2 1 1   从后向前找,初始都是1,遇到递增的就加上他前面查找的数字

最终        1 2 1 2 1 2 1 3 2 1 1 1 3 2 1 2

int candy(vector
&ratings) { int ans = 0; vector
candysUp(ratings.size(), 1); vector
candysDown(ratings.size(), 1); for(int i = 1; i < ratings.size(); i++) //查找递增 { if(ratings[i] > ratings[i - 1]) { candysUp[i] += candysUp[i - 1]; } } for(int i = ratings.size() - 2; i >= 0; i--) //查找递减 { if(ratings[i + 1] < ratings[i]) { candysDown[i] += candysDown[i + 1]; } } for(int i = 0; i < ratings.size(); i++) { ans += max(candysUp[i], candysDown[i]); } return ans; }

 

大神只循环一遍的思路:

其实整体思想跟上面一样,但是上面需要循环很多次是因为递增和递减分别处理。因为递减时不知道最大的数应该加几。

大神的思路是递增的就像上面那样加,但是递减的,先都加1,如果后面仍是递减的,再把之前少加的给加回来(如前面有nSeqLen个数字少加了1,就把答案直接多加一个nSeqLen)。

//大神循环一遍的代码    int candy2(vector
&ratings) {
int nCandyCnt = 0;///Total candies int nSeqLen = 0; /// Continuous ratings descending sequence length int nPreCanCnt = 1; /// Previous child's candy count int nMaxCntInSeq = nPreCanCnt; if(ratings.begin() != ratings.end()) { nCandyCnt++;//Counting the first child's candy. for(vector
::iterator i = ratings.begin()+1; i!= ratings.end(); i++) { // if r[k]>r[k+1]>r[k+2]...>r[k+n],r[k+n]<=r[k+n+1], // r[i] needs n-(i-k)+(Pre's) candies(k
*(i-1)) { nPreCanCnt++; } else { nPreCanCnt = 1; } nCandyCnt += nPreCanCnt; nSeqLen = 0; nMaxCntInSeq = nPreCanCnt; } } } return nCandyCnt;}

 

转载地址:http://sdfgx.baihongyu.com/

你可能感兴趣的文章
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
复杂业务下,我们为何选择Akka作为异步通信框架?
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>