[LeetCode 题解]:Candy
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的更多相关文章
- leetcode题解 candy
要求的条件是: 1.每个人最少一个糖果. 2.相邻的小朋友,要保证,评分高的比评分低的糖果多. 如果从一侧扫描的话,容易确定的就是递增序列,只要上升1个就够了. 容易出现问题的就是:遇到下降期,或者相 ...
- 【LeetCode题解】二叉树的遍历
我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...
- leetcode题解-122买卖股票的最佳时期
题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...
- 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)
目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...
- 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)
目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)
目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...
- 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...
- 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)
目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...
- 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)
目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...
随机推荐
- 08_java超市管理系统
超市管理系统功能介绍 * A:超市管理系统功能介绍 * a: 显示主菜单 ============欢迎光临ItCast超市============ 1: 货物 清单 2: 添加货物 3: 删除货物 4 ...
- Arduino教程资料汇总(8月22日悄悄跟新了一下)
http://www.geek-workshop.com/thread-985-1-1.html 本帖最后由 迷你强 于 2013-8-31 12:36 编辑 =====F-101 arduino基础 ...
- 我的Linux之路——实现虚拟机VMware上linux与windows互相复制与粘贴
出自:http://blog.csdn.net/u012243115/article/details/40454063 解决方法:只需要在CentOS安装一个vmware-tools的工具. 1.打开 ...
- 迷你MVVM框架 avalonjs 组件编写指南
avalon经过半年的宣传,已经有不少公司在使用avalon应用于它们内外网应用或移动项目,比较大牌的客户有百度,搜狐,金山,边缘,去哪儿--最近成为去哪儿的前端架构师后,掌握更多资源,可以随使抓个人 ...
- WCF配置多个终节点
配置多个终节点的意义(自己理解):一个服务可以有多个终节点,网上也经常有人说终节点才是服务的真正的接口,的确如此,当我们为一个服务配置多个终节点时,就表明这个服务可以被以不同的方式访问(不同的绑定等等 ...
- Linux实战教学笔记30:Nginx反向代理与负载均衡应用实践
1.1 集群简介 简单地说,集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器.这些服务器之间可 ...
- python 文件的读取&更新
[python 文件的读取&更新] 任务抽象: 读取一个文件, 更新内容后, 重新写入文件. 实际应用: 磁盘上的一个配置文件, 读入内存后为一个dict, 对dict更新后重新写入磁盘. d ...
- Python基础:面向对象基础 (一) 类及其属性和魔法方法
定义类,添加和获取对象属性 # 定义类 格式如下 # class 类名: # 方法列表 # 新式类定义形式 # info 是一个实例方法,第一个参数一般是self,表示实例对象本身 class Her ...
- [hdu4347]The Closest M Points(线段树形式kd-tree)
解题关键:kdtree模板题,距离某点最近的m个点. #include<cstdio> #include<cstring> #include<algorithm> ...
- 69. Sqrt(x) (Divide-and-Conquer)
Implement int sqrt(int x). Compute and return the square root of x. 注意: 计算平方的时候可能会溢出,所以mid要定义为long 另 ...