采用三次遍历,第一次从左到右遍历,将右边大的数字加一,小的减一
1,2,3,4,3,2,1
1,2,3,4,1,0,-1
第二次从右到左,检测小于1的数,然后加上add等于1,然后在递减序列中都加上add
1,2,3,4,3,2,1
最后一遍从左到右检测是否有不满足相邻的分数越大,糖果越多的情况,有的话纠正
解答完毕
int candy(vector<int>& ratings) { int length = ratings.size(); if (length < 2) return 1; vector<int> data(length, 1); int sum = 0; for (int i = 0; i < length-1; i++) { if (ratings[i] < ratings[i + 1]) data[i + 1] = data[i] + 1; else if (ratings[i] > ratings[i + 1]) { if (data[i] > 1) data[i + 1] = 1; else data[i + 1] = data[i] - 1; } } for (int j = length - 1; j > 0; j--) { if (data[j] < 1) { int add = 1 - data[j]; while ( j > 0 && data[j] + 1 == data[j - 1]) { data[j] += add; j--; } data[j] += add; } } for (int i = 0; i < length - 1; i++) { if (ratings[i] > ratings[i + 1] && data[i] <= data[i + 1]) data[i] = data[i + 1] + 1; else if (ratings[i] < ratings[i + 1] && data[i] >= data[i + 1]) data[i+1] = data[i] + 1; } for (auto x : data) sum += x; return sum; }
网上有更好的解法,只需要两次遍历,这里不再累述。