您的位置:首页 > 其它

[LeetCode]135. Candy

2017-02-21 12:56 246 查看
https://leetcode.com/problems/candy/?tab=Description

分数高的分的糖果要比两边的多,每人最少一个,求最少糖果数

最优解:

记录连续下降长度down以及下降开头位置prev,如果down >= prev,说明下降的结尾糖果数小于等于零了,就把prev删掉,将prev+down的下降序列替换成结尾为1的降序序列

public class Solution {
public int candy(int[] ratings) {
if (ratings == null || ratings.length == 0) {
return 0;
}
int res = 1;
int down = 0;
int prev = 1;
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] >= ratings[i - 1]) {
if (down > 0) {
res += (down + 1) * down / 2;
if (prev <= down) {
res += down + 1 - prev;
}
prev = 1;
down = 0;
}
prev = ratings[i] == ratings[i - 1] ? 1 : prev + 1;
res += prev;
} else {
down++;
}
}
if (down > 0) {
res += (down + 1) * down / 2;
if (prev <= down) {
res += down + 1 - prev;
}
}
return res;
}
}

时空复杂度均为O(n)解法:

从左到右遍历,保证与左侧邻居关系满足;再从右向左遍历,保证与右侧关系满足同时不破坏左侧关系(用max)

public class Solution {
public int candy(int[] ratings) {
int res = 0;
int[] candy = new int[ratings.length];
Arrays.fill(candy, 1);
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] > ratings[i - 1]) {
candy[i] = candy[i - 1] + 1;
}
}
for (int i = ratings.length - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candy[i] = Math.max(candy[i], candy[i + 1] + 1);
}
}
for (int c : candy) {
res += c;
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: