[leetcode] 135.Candy

原创 2015年07月10日 17:58:14

题目:
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个小孩围坐一圈,每个小孩有个数值。现在需要给小孩糖。
每个小孩最少一个糖。
小孩子拥有更高的值就应该拥有更多的糖。
找出最少需要几颗糖。
思路:
引用”水中的鱼“博客中的图,如下:
这里写图片描述
我们可以把每一个递增,每一个递减区分开来。但是会出现的情况有两种:由于极大值点比较小(比如上图中左边例子的极大值是2),导致到达谷底时,出现了负值,或者到达谷底时出现的值比1大。
先将每一个孩子设定为只给一颗糖(即每个孩子都有可能是在谷底),那么我们从左往右扫描,只考虑递增的情况,遇到递增的就将该孩子的糖设置为前者糖的数量加1,也就是说这样子从左往右扫描一遍可以保证谷底的元素不会是负数,谷底的元素一定是1。上图左边的例子就会变成1,2,1,1,1,但是很明显,第三第四个元素应该比最后一个元素来的大。这时候开始修正,从最右边往最左边扫描,如果是递增的,那么按照递增的顺序改变值,那么上面的例子就会变成1,4,3,2,1,第二,三,四个元素都需要修正。我们再考虑右边的那个例子。第一遍才从左到右扫描完糖的数目是1,2,3,4,1,1,2,然后从右往左修正,得到结果是把第五个数的1,变成比第六个数大1,即2,所以结果是1,2,3,4,2,1,2
代码如下:

class Solution {
public:
    int candy(vector<int>& ratings) {
        int size = ratings.size();
        if(size <= 1)return ratings.size();
        vector<int> nums(size, 1);
        for(int i = 1; i < size; i++) {
            if(ratings[i] > ratings[i-1])
                nums[i]  = nums[i-1] + 1;
        }
        for(int i = size - 1; i > 0; i--) {
            if(ratings[i-1] > ratings[i])
                nums[i-1] = max(nums[i-1], nums[i] + 1);
        }
        int result = 0;
        for(int i = 0; i < size; i++)
            result += nums[i];
        return result;
    }
};

【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

【博文总目录>>>】 LeetCode算法题典   LeetCode是一个准备面试非常有用的网站,是非常值得去的地方,里面都是一些经典的面试题,这些题目在Google,Microsof...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月16日 06:27
  • 24705

LeetCode 问题汇总(算法,难度,频率)

Id Question Difficulty Frequency Data Structures Algorithms 1 T...
  • sbitswc
  • sbitswc
  • 2014年03月13日 11:58
  • 12088

[LeetCode刷题笔记] 关于LeetCode的前言

又到了一年毕业就业季了,三年前的校招季我逃避了,可这一次终于还是要轮到我了=_=||。 作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢? LeetCode收录了许多互联网...
  • tostq
  • tostq
  • 2016年07月22日 21:32
  • 2989

leetcode解题总结(持续更新)

树型:DFS或BFS(不够+状态存储,缩短时间)(如数位DP,就是DFS+状态存储) 链表:多用two pointer 无序数组:hash映射(O(1),map,set等),并查集,字典树tire 有...
  • ChinaJane163
  • ChinaJane163
  • 2016年09月21日 20:53
  • 609

[leetcode]--刷leetcode算法目录和算法总结目录

这篇博文是记录所有刷leetcode算法的目录以及全部源码的github地址:所有代码的github地址:https://github.com/leetcode-hust/leetcode/tree/...
  • u010853261
  • u010853261
  • 2017年02月02日 07:54
  • 1011

LeetCode 题目总结/分类

注:此分类仅供大概参考,没有精雕细琢。有不同意见欢迎评论~利用堆栈:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/h...
  • yangliuy
  • yangliuy
  • 2015年03月21日 11:29
  • 7377

leetcode中,代码如何调试,创造本地运行环境

初次接触leetcode,是我在一个招聘网站上看的,这个OJ真有那么厉害吗? 这几天在这个OJ上做了几道题,发现他的几个特点,1、题目不难(相对于ACM来说,我被ACM虐到至今无力),评判没那么苛刻...
  • bg2bkk
  • bg2bkk
  • 2014年07月08日 21:06
  • 6774

Leetcode五大常用算法

Leetcode的5大常用算法
  • x_r_su
  • x_r_su
  • 2016年09月07日 17:30
  • 663

leetcode 刷起!!!!

今天终于开始刷Leetcode了。            开始用的facebook账号登陆的,提示要发送验证邮箱通过验证之后才能在上面跑代码,坑的是,我点了一下,提示发送成功,一分钟邮箱没有...
  • qq_21071767
  • qq_21071767
  • 2015年09月15日 20:25
  • 1063

LeetCode最常见的面试笔试题总结

找了一段时间的实习,总结一下LeetCode上面试出现频率比较高的题,只总结一部分,后续还会继续更新。一、Two Sum题意是给出一个数组,输出和为k的两个数。数组为无序的。 这道题的解题思路是先把...
  • u014486880
  • u014486880
  • 2016年04月26日 23:55
  • 8248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[leetcode] 135.Candy
举报原因:
原因补充:

(最多只允许输入30个字)