您的位置:首页 > 其它

Candy [leetcode] O(n)时间复杂度,O(1)空间复杂度的方法

2014-10-27 09:35 441 查看
对于ratings[i+1],和ratings[i]的关系有下面几种:

1. 相等。相等时ratings[i+1]相应的糖果数为1

2.ratings[i + 1] > ratings[i]。在这样的情况下,要寻找以ratings[i]開始的递增序列。

3.ratings[i + 1] < ratings[i]。在这样的情况下,要寻找以ratings[i]開始的递减序列。

对于随意一个递增序列 [2 3 4 5 6] 相应的糖果数为 [1 2 3 4 X]

对于随意一个递减序列[6 5 4 3 2]相应的糖果数为[X 4 3 2 1]

X为递增和递减序列交际处的元素相应糖果数。应该是递增序列长度和递减序列长度中较大的值

代码例如以下:

int candy(vector<int> &ratings) {
if (ratings.size() == 0) return 0;
int sum = 0;
int candyNum = 1;
for (int i = 0; i < ratings.size() - 1;)
{
if (ratings[i] == ratings[i + 1])
{
//if is the same rating, reset candy num. ie: 1 3 3, for the 2nd 3, candy num is 1
sum += candyNum;//add current candy num
i++;
candyNum = 1;//set next candy num to 1
}
else if (ratings[i] < ratings[i + 1])
{
// find ascending sequence, until i is the end of sequence. ie: 1 2 3 1, ratings[i] is 3
for (;i < ratings.size() - 1 && ratings[i] < ratings[i + 1]; i++) sum += (candyNum++);
}
else if (ratings[i] > ratings[i + 1])
{
// find descending sequence, until i is the end of sequence. ie: 3 2 1 3, rating[i] is 1
int decCount = 1;
for (; i < ratings.size() - 1 && ratings[i] > ratings[i + 1]; i++) sum += (decCount++);
sum += max(candyNum, decCount);//add first element of the sequence
//remove last element of the sequence, as i is the end of sequence, and i's candy num shouldn't be calculated into sum
sum --;
candyNum = 1;
}
}
sum += candyNum;
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐