To_10_r_100_1---N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果
2015-06-07 23:53
543 查看
题目:
N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果: (1)每个孩子至少分得一颗糖果 (2)权重较高的孩子,会比他的邻居获得更多的糖果。问:总共最少需要多少颗糖果?请分析算法思路,以及算法的时间,空间复杂度是多少。
思路:先把每个孩子的糖初始化为1,经过两轮扫描:第一轮:保证后面比前面权值高的孩子,必定多得1个糖果第二轮:保证前面比后面权值高的孩子,必定多得1个糖果把分配矩阵求和即可
C++代码实现:
N个孩子站成一排,给每个人设定一个权重(已知)。按照如下的规则分配糖果: (1)每个孩子至少分得一颗糖果 (2)权重较高的孩子,会比他的邻居获得更多的糖果。问:总共最少需要多少颗糖果?请分析算法思路,以及算法的时间,空间复杂度是多少。
思路:先把每个孩子的糖初始化为1,经过两轮扫描:第一轮:保证后面比前面权值高的孩子,必定多得1个糖果第二轮:保证前面比后面权值高的孩子,必定多得1个糖果把分配矩阵求和即可
C++代码实现:
int candy(int *ratings, int size){ int *distributions = new int[size]; //let all the elements of distributions to be 1 for (int i = 0; i < size; i++) distributions[i] = 1; for (int i = 1; i < size; i++){ if (ratings[i - 1]<ratings[i]) distributions[i] = distributions[i - 1] + 1; } for (int i = 1; i < size; i++){ if (ratings[size - i]<ratings[size - i - 1] && distributions[size - i] > distributions[size - i - 1]) distributions[size - i - 1] = distributions[size - i] + 1; } //for sum int sum = 0; for (int j = 0; j < size; j++) sum += distributions[j]; //free the memory delete[] distributions; return sum; }
相关文章推荐
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- 数据结构之Treap详解
- JavaScript数据结构和算法之图和图算法
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- java数据结构和算法学习之汉诺塔示例
- Java数据结构之简单链表的定义与实现方法示例
- 数据结构之AVL树详解
- qqwry.dat的数据结构图文解释第1/2页
- Lua学习笔记之数据结构
- Redis中5种数据结构的使用场景介绍
- PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
- JavaScript数据结构与算法之栈详解
- 数据结构之红黑树详解
- 数据结构之位图(bitmap)详解
- 数据结构之伸展树详解
- 利用Python演示数型数据结构的教程
- MongoDB系列教程(七):MongoDb数据结构详解