Leetcode candy中c++解法
来源:互联网 发布:哪些手机可以刷ubuntu 编辑:程序博客网 时间:2024/06/05 14:20
/********************************************************************************** * * 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 例如5, 6, 7, 4, 1, 2, 3, 2, 1, 7是一个权重数组 则 1 2 3 1 1 2 3 1 1 2 然后从右向左即可做出统计total的值#include <stdlib.h>#include <time.h>#include <iostream>#include <vector>using namespace std;void print(vector<int> &v);/* * The soluiton is O(2n) run-time complexity * * For example: * * ratings[] = { 5, 6, 7, 4, 1, 2, 3, 2, 1, 7 } * * 1) Go through the ratings from left to right. * * Find the each increasing sub-array, giving the minimal candy * * ratings[] = { 5, 6, 7, 4, 1, 2, 3, 2, 1, 7 } * ------> -> ------> -> ---> * candy[] = { 1, 2, 3, 1, 1, 2, 3, 1, 1, 2 } * * 2) Go through the raings from right to left. * * ratings[] = { 5, 6, 7, 4, 1, 2, 3, 2, 1, 7 } * <- <- <------ <- <------ <- * prev_candy[] = { 1, 2, 3, 1, 1, 2, 3, 1, 1, 2 } * +1 +1 * candy[] = { 1, 2, 3, 2, 1, 2, 3, 2, 1, 2 } * * 3) total candy is 19 * */int candy(vector<int> &ratings) { vector<int> candyCnt(ratings.size()) ; //allocate candies, considering the minimal rating on the left candyCnt[0] = 1; for(int i = 1; i < ratings.size(); i++){ candyCnt[i] = ratings[i] > ratings[i-1] ? candyCnt[i-1]+1 : 1; } print(candyCnt); //modify the allocation, considering the minimal rating on the right int totalCandy = candyCnt[ratings.size()-1]; for(int i = ratings.size()-2; i >= 0; i--){ candyCnt[i] = (ratings[i] > ratings[i+1] && candyCnt[i+1]+1 > candyCnt[i]) ? candyCnt[i+1]+1 : candyCnt[i]; //count total candies by the way totalCandy += candyCnt[i]; } print(candyCnt); return totalCandy;}void generateRatings(vector<int> &ratings, int n) { srand(time(0)); for (int i=0; i<n; i++) { ratings.push_back(rand()%10); }}void print(vector<int> &v) { for(int i=0; i<v.size(); i++){ cout << v[i] << " "; } cout << endl;}int main(int argc, char**argv){ int n = 10; if (argc>1){ n = atoi(argv[1]); } vector<int> ratings; generateRatings(ratings, n); print(ratings); cout << candy(ratings) << endl; cout << "--------------------" << endl; int r[] = { 5, 6, 7, 4, 1, 2, 3, 2, 1, 7 }; vector<int> ra(r, r+sizeof(r)/sizeof(r[0])); print(ra); cout << candy(ra) << endl; return 0;}
0 0
- Leetcode candy中c++解法
- LeetCode Candy 两种解法
- candy-leetcode :只需要遍历一遍的解法
- leetcode刷题系列C++-candy
- Leetcode: Candy
- LeetCode:Candy
- [leetcode]Candy
- Leetcode: Candy
- 【leetcode】Candy
- LeetCode:Candy
- [LeetCode] Candy
- [LeetCode]Candy
- [LeetCode] Candy
- 【LeetCode】Candy
- LeetCode | Candy
- Leetcode: Candy
- Candy - LeetCode
- leetcode Candy
- Python基础(二)
- Google Play services工程
- sudo的使用场景
- MySQL用户变量与系统变量
- Yii2 实现后台操作记录日志
- Leetcode candy中c++解法
- 工厂类模式实现
- 构建前端开发环境之----使用express处理POST跨域请求
- Python items函数 基础知识篇
- JS判断元素类型
- iOS代码规范
- UIImageView
- from表单中的lable标签
- UVA - 133 The Dole Queue 单纯模拟:1A