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?

题目的意思是 有N个孩子排成一排,并给每个孩子分配一个rating值。按照如下规则给孩子们分配糖果:

(1) 每个孩子必须分至少一个糖果。

(2)相邻的孩子间,具有高rating值的孩子要多得一个糖果。

按照题目的意思,我们给定一个序列:

(1)递增序列

  1 5 7 9

  很容易得到分配的糖果数依次为:1,2,3,4

(2)递减序列

  8 6 4 2

  也很容易得到分配的糖果数依次为:4,3,2,1

(3)单波形序列

  1 3 5 7 6 4 

  有两个子序列: 1,3,5,7 以及7,6,4

  对应分配糖果序列:1,2,3,4 以及3,2,1

  在此过程中7,在两个序列中都出现了,但是在左边需要分配4颗糖,在右边则要分配3颗糖,那么在最终的序列中需要分配多的一端。因此最后的分配序列为:

  1,2,3,4,2,1   sum= 1+2+3+4+2+1 = 13

  7 5 4 3 9 10

  有两个子序列: 7,5,4,3 以及3,9,10

  分配按照子序列发糖: 4,3,2,1 以及1,2,3

  默认最小的值分配最少的糖,1颗。因此最后的分配序列为:

  4,3,2,1,2,3  sum = 4+3+2+1+2+3 = 15

(4)多波形

  1 2 3 9 8 7 5 2 4 6 5 3 4

  看似无序,但是可以分成多个递增和递减序列

  递增序列:     1 2 3 9 _ _ _ 2 4 6 _ 3 4

  递减序列:     _ _ _ 9 8 7 5 2 _ 6 5 3 _

  增序列分配:   1 2 3 4 _ _ _ 1 2 3 _ 1 2

  减序列分配:   _ _ _ 5 4 3 2 1 _ 3 2 1 _

  最终的分配结果:  1 2 3 5 4 3 2 1 2 3 2 1 2 

经过上述分析,可以看出糖果的分配可以分成两种序列进行分配,一种是非增序列,另一中则是非减序列

分别定义两个序列 up 以及down,分别记录非减序列和非增序列

(1)从头至尾遍历一次,找出递增序列up

  array up initial with all element equals to 1

  for i from ratings.begin to ratings.end

  do

    if   ratings[i] > ratings [i-1] then

      up[i] <- up[i-1] +1

    end if

(2)从尾向头遍历一次,找出递减序列down

  array down initial with all element equals to 1

  for i from ratings.rbegin to ratings.rend

  do

    if   ratings[i] > ratings [i+1] then

      up[i] <- up[i+1] +1

    end if

(3) 比较up 和down 相应位置,选择较大的值作为最终结果

  sum <- 0

  for i from ratings.begin to ratings.end

  do

    sum <-  sum + max{up[i], down[i]}

  end for

  return sum

 class Solution {
public:
int candy(vector<int> &ratings) {
int len = ratings.size();
if(len<=) return len;
int i,tot=;
vector<int> up(len,);
vector<int> down(len,);
for(i=;i<len;i++)
if(ratings[i]>ratings[i-]) up[i] = up[i-]+;
for(i=len-;i>=;i--)
if(ratings[i]>ratings[i+]) down[i]= down[i+]+;
for(i=;i<len;i++){
tot += max(up[i],down[i]);
}
return tot;
}
};

转载请注明出处: http://www.cnblogs.com/double-win/ 谢谢

[LeetCode 题解]:Candy的更多相关文章

  1. leetcode题解 candy

    要求的条件是: 1.每个人最少一个糖果. 2.相邻的小朋友,要保证,评分高的比评分低的糖果多. 如果从一侧扫描的话,容易确定的就是递增序列,只要上升1个就够了. 容易出现问题的就是:遇到下降期,或者相 ...

  2. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  3. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  4. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  5. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  6. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  7. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  8. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  9. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  10. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

随机推荐

  1. day9-Memcached & Redis使用

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  2. Django 组件-cookie 与 session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  3. vue 时间选择器组件

    vue 时间选择器组件 组件效果: 单文件组件: <template> <div class="date-pickers"> <!--date为com ...

  4. spring maven项目解决依赖jar包版本冲突方案

    引入:http://blog.csdn.net/sanzhongguren/article/details/71191290 在spring reference中提到一个解决spring jar包之间 ...

  5. ui-router 留存

    学习 ui-router - 路由控制 022014年01月 参考原文:https://github.com/angular-ui/ui-router/wiki/URL-Routing 在你的应用中大 ...

  6. 修改SecureCRT终端的Home和End功能键。

    SecureCRT真是个不错的ssh客户端工具,但在使用时发现跟自己的一些使用习惯不符合,例如home.end.pageup.pagedown和delete等键. 默认情况下一些按键的功能如下: pa ...

  7. vmvare centos7 切换桌面和命令行模式

    systemctl set-default multi-user.target     命令行 systemctl set-default graphical.target      桌面

  8. java基于feemarker 生成word文档(超级简单)

    问题由来: 开发个新需求,需要按规定导出word文档,文档截图如下 因为之前没做过这个,一脸懵B啊,导出excel和txt倒是经常接触到,对于这个word这种格式不严谨的文件怎么处理呢? 技术选型:可 ...

  9. 大话CNN

    这几年深度学习快速发展,在图像识别.语音识别.物体识别等各种场景上取得了巨大的成功,例如AlphaGo击败世界围棋冠军,iPhone X内置了人脸识别解锁功能等等,很多AI产品在世界上引起了很大的轰动 ...

  10. 我为什么使用Kubuntu

    网上看贴,包括身边的同事.朋友,总会问的问题是:我该选择哪个Linux发行版?使用久了,就会觉得这个问题其实不是问题,纯属个人习惯而已,当你真正习惯.理解了Linux,那么任何一个发行版的优点,你都有 ...