[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?
题意:给定无序的数列,保证大的比两侧中小的得到的糖果多,每个至少有一个
思路:正反遍历两次,正向遍历(从左往右)时,若后者比前者大,后者在前者的基础上加1;反向遍历,后者比前者小,前者加1。正向遍历一次,还是比较好想到的,那为什么要遍历两次,若整个数列是递减数列,则若只正向遍历一遍,所有得到的糖果都是1,这显然不符合题意,如4,3,2,1 ,其实只要开始时降序的就不行。那么方向遍历过程中,是不是只要前者比后者大就加1了?不是,我们举个反例“4,1,2,1”,正向遍历是,这四个小孩的得到的糖果数是:1,1,2,1,那么反向遍历时,若只要前者比后者大就加1会得到: 2,1,3,1,这显然不符合最少糖果的要求,最少应为2,1,2,1,这是因为正向遍历中,数组A[2]对应的元素值比两边都大,已经满足了其所得糖果比两边大的条件。总结一下:正向遍历,无法满足数组首元素为降序的情况;反向遍历,若只考虑前者比后者大,不满足若某元素已经取得局部最大的情况。所以此时应该加一定的限制条件,如代码所示:
class Solution {
public:
int candy(vector<int> &ratings)
{
int len=ratings.size();
int res=;
vector<int> cans(len,);
if(len<) return ;
for(int i=;i<len-;++i)
{
if(ratings[i]<ratings[i+])
cans[i+]=cans[i]+;
}
for(int i=len-;i>;i--)
{
if(ratings[i]<ratings[i-]&&cans[i-]<=cans[i]) //限定
cans[i-]=cans[i]+;
}
for(int i=;i<len;++i)
res+=cans[i];
return res;
}
};
还有一种空间复杂度为O(1)的解法,见GeekFans的博客,不过个人感觉思想类似,有兴趣可以看看。
[Leetcode] candy 糖果的更多相关文章
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...
- [LeetCode] Candy 分糖果问题
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- [LeetCode] Candy Crush 糖果消消乐
This question is about implementing a basic elimination algorithm for Candy Crush. Given a 2D intege ...
- [Leetcode 135]糖果分配 Candy
[题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- leetcode — candy
/** * Source : https://oj.leetcode.com/problems/candy/ * * There are N children standing in a line. ...
- Leetcode Candy
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- [leetcode]Candy @ Python
原题地址:https://oj.leetcode.com/problems/candy/ 题意: There are N children standing in a line. Each child ...
- LeetCode: Candy 解题报告
Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- 算法题之Leetcode分糖果
题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...
随机推荐
- web学习第二天
今天是学习web的第二天,早上用css3做了个会动的小熊,border-radius为圆的半径, .smallxiong { width: 400px; height: 400px; ...
- 使用mysql5.7版本数据库需要注意的地方/持续更新
数据库mysql 5.7版本的初始密码修改 安装完后实在是找不到初始密码的文件,后面发现再错误日志中 先关闭mysql pkill mysqld 安全模式启动数据库并修改密码 mysqld_safe ...
- 剑指offer题目系列二
本篇延续上一篇,介绍<剑指offer>第二版中的四个题目:从尾到头打印链表.用两个栈实现队列.旋转数组的最小数字.二进制中1的个数. 5.从尾到头打印链表 题目:输入一个链表的头结点,从尾 ...
- WebSocket 的使用
Java 控制台程序实现类似广播功能 服务器端代码 添加 maven 依赖 <dependency> <groupId>javax.websocket</groupId& ...
- KMP算法(查找子序列)
KMP类似暴力,但是不会和暴力完全一样,回溯到起点. 简单的说 假如 模板链字符串是: abcabcabcabd 寻找abcabd 在模板链出现的次数,并且输出该次数 ...
- Delphi中客户端获取数据库更新信息(更新条数)
1.SQL语句 from tb where xxx='XXX') //不存在,则插入数据 begin insert into tb(xxx) values('XXX') //这里自己定义,插入或更新都 ...
- Go中的系统Signal处理
package main import "fmt" import "os" import "os/signal" import " ...
- mysql连接jdbc查询代码
package com.answer.test; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.S ...
- jmeter多用户登录跨线程组操作传值
项目需求: 需要登录两个用户A.B,用户A操作完后会通知B,然后B再操作,B操作完结束或者再通知A. 实现思路: 1. 设置两个线程组Ⅰ.Ⅱ,组Ⅰ添加cookie管理器,里面添加用户A的操作:组Ⅱ添加 ...
- android问题笔记集
开发工具:android studio2.2 调试:手机直连调试,版本(android6) 问题1: Error:Unable to start the daemon process. This pr ...