Leetcode_candy
来源:互联网 发布:股票量化交易软件 编辑:程序博客网 时间:2024/05/16 10:52
地址:http://oj.leetcode.com/problems/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?
思路:两次遍历,一次从头到尾,一次从尾到头,O(N)时间复杂度。用分治法在第二十个case时wa了,case太多又无法自测。把wa的分治法代码贴出来,有哪位大哥大姐能看出错误请留个言啊。。。
参考代码:
class Solution {public: int candy(vector<int> &ratings) { if(ratings.empty()) return 0; vector<int>vec(ratings.size(), 1); for(int i = 0; i<ratings.size()-1; ++i) { if(ratings[i]<ratings[i+1]) { vec[i+1] = vec[i]+1; } } for(int i = ratings.size()-2; i>=0; --i) { if(ratings[i]>ratings[i+1]) { vec[i] = max(vec[i], vec[i+1]+1); } } return accumulate(vec.begin(), vec.end(), 0); }};
分治法WA 代码:
class Solution {public: void dispatch(vector< int>&ratings, vector< int>&vec, int st, int ed) { if(st < ed - 1) { int mid = (st+ed)/2; dispatch(ratings, vec, st, mid); dispatch(ratings, vec, mid+1, ed); if(ratings[mid]<ratings[mid+1]) { if(vec[mid]>=vec[mid+1]) { vec[mid+1] = vec[mid]+1; int i = mid+1; while(i<ed && ratings[i]<ratings[i+1]) { vec[i+1] = vec[i]+1; ++i; } } } else if(ratings[mid]>ratings[mid+1]) { if(vec[mid]<=vec[mid+1]) { vec[mid] = vec[mid+1]+1; int i = mid; while(i>st && ratings[i]<ratings[i-1]) { vec[i-1] = vec[i]+1; --i; } } } } else if(st==ed) vec[st] = 1; else { if(ratings[st]<ratings[ed]) { vec[st] = 1; vec[ed] = 2; } else if(ratings[st]>ratings[ed]) { vec[st] = 2; vec[ed] = 1; } else vec[st] = vec[ed] = 1; } } int candy(vector< int> &ratings) { if(ratings.empty()) return 0; vector< int>vec(ratings.size(), 0); dispatch(ratings, vec, 0, ratings.size()-1); int ans = accumulate(vec.begin(), vec.end(), 0); return ans; }};
//SECOND TRIAL, almost the sameclass Solution {public:int candy(vector<int> &ratings) {if(ratings.empty())return 0;vector<int>vec(ratings.size(), 0);vec[0] = vec[vec.size()-1] = 1;for(int i=0; i<ratings.size()-1; ++i)if(ratings[i]<ratings[i+1])vec[i+1] = vec[i]+1;elsevec[i+1] = 1;for(int i=ratings.size()-2; i>=0; --i)if(ratings[i]>ratings[i+1])vec[i] = max(vec[i], 1+vec[i+1]);return accumulate(vec.begin(), vec.end(), 0);}};
python version
class Solution:# @param ratings, a list of integer# @return an integerdef candy(self, ratings):if not ratings:return 0vec = [1]*len(ratings)for i in range(0, len(ratings)-1):if ratings[i] < ratings[i+1]:vec[i+1] = 1 + vec[i]for i in range(len(ratings)-2, -1, -1):if ratings[i] > ratings[i+1]:vec[i] = max(vec[i], 1+vec[i+1])return sum(vec)
0 0
- Leetcode_candy
- LeetCode_Candy
- leetcode_Candy
- leetCode_Candy
- 访问资源库
- android Handler小结
- 如何根据手机屏幕尺寸做不同的网页呢
- NSTimer在后台运行
- 关于图片或者文件在数据库的存储方式归纳
- Leetcode_candy
- 编译asm形式的helloworld在android下运行
- Linux3.4内核Nand Flash驱动的移植
- 设置端口可以重用 setsockopt()
- SWISS-PROT Format说明
- java控制台万年历2
- 黑马程序员---java高新技术之类加载器
- 转载 由笑话体悟人生
- GStreamer播放教程09——数字音频传输