Candy
来源:互联网 发布:陕西南路美食知乎 编辑:程序博客网 时间:2024/06/17 15:11
题目: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 2 3 4 1,这个时候4>1,如果把数值+1,那么接下来往左走就会出现问题。
第二种思路一开始都是一样,但是定义了一个cur=table[i+1]+1,这个时候要注意的一种情况就是比如比率是 1 2 3 1,前面的table是1 2 3 1,如果仅仅是+1,,还没有3大,所以就是判断一下最大值,至于后面,为什么要把刚刚的cur值复制给table[i],一方面可以这么理解,如果没有前面一个比率比后面一个大,这是自然要赋值的,如果发生了,那就把刚刚的最大值给他。
代码:
class Solution1 {public://第一种解法 int candy(vector<int>& ratings) { if(ratings.empty()) return 0; int n = ratings.size(); vector<int> table(n, 1); for(int i=1;i<n;i++){ if(ratings[i]>ratings[i-1]) table[i]=table[i-1]+1; } int res=table[n-1]; for(int i=n-2;i>=0;i--){ if(ratings[i]>ratings[i+1]&&table[i]<=table[i+1]) table[i]=table[i+1]+1; //杜绝 1 2 1 现象的发生 res+=table[i]; } return res; }};class Solution2 {public://第二种解法 int candy(vector<int>& ratings) { if(ratings.empty()) return 0; int n = ratings.size(); vector<int> table(n, 1); for(int i=1;i<n;i++){ if(ratings[i]>ratings[i-1]) table[i]=table[i-1]+1; } int res=table[n-1]; for(int i=n-2;i>=0;i--){ int cur=1; if(ratings[i]>ratings[i+1]){ cur=table[i+1]+1; } res+=max(cur,table[i]); table[i]=max(cur,table[i]); //table[i]=cur 或者 table[i]=max(cur,table[i]) 均可 // 没有“table[i]=cur;” 对 [1,3,1] 无影响 } return res; }};
0 0
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- candy
- Candy
- Candy
- Candy
- Candy
- navicat常用快捷键
- 静态关键字static和静态代码块、局部代码快、构造代码块
- 继电器驱动电路设计
- 开源 iOS 项目分类索引大全
- 【poj2342】Anniversary party
- Candy
- android中删除文件夹以及文件夹中的文件的方法
- iOS状态栏电量条颜色设置
- 百度地图sdk Android开发学习笔记(一)
- 3DTouch Demo
- mysql数据库常用语句
- 第九周--项目4广义表算法库及应用(1)
- label.setText(num);会报错问题解决方案
- 学习 C++类的多态