题目
代码(7.25 首刷看解析 双向遍历)
先从左到右,比左边大就加一;然后从右往左,比右边大就加一,然后二者取较大值。
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> res(n, 1);
int nowCandy = 1;
for(int i = 1; i < ratings.size(); i++) {
if(ratings[i] > ratings[i-1])
res[i] = ++nowCandy;
else nowCandy = 1;
}
nowCandy = 1;
for(int i = n - 2; i >= 0; i--) {
if(ratings[i] > ratings[i+1])
res[i] = max(res[i], ++nowCandy);
else nowCandy = 1;
}
int ans = 0;
for(int& candy : res) ans += candy;
return ans;
}
};
代码(8.31 二刷看解析)
class Solution {
public:
int candy(vector<int>& arr) {
int curCandy = 1;
int n = arr.size();
vector<int> res(n, 1);
for(int i = 1; i < n; i++) {
if(arr[i] > arr[i-1]) {
curCandy++;
res[i] = curCandy;
} else {
curCandy = 1;
}
}
curCandy = 1;
for(int i = n-2; i >= 0; i--) {
if(arr[i] > arr[i+1]) {
res[i] = max(res[i], ++curCandy);
} else {
curCandy = 1;
}
}
int ans = 0;
for(int& can : res)
ans += can;
return ans;
}
};
代码(10.2 三刷自解)
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> candies(n, 1);
int nowCandy = 1;
for(int i = 1; i < n; i++) {
if(ratings[i] > ratings[i-1]) {
candies[i] = ++nowCandy;
} else {
nowCandy = 1;
}
}
nowCandy = 1;
for(int i = n-2; i >= 0; i--) {
if(ratings[i] > ratings[i+1]) {
candies[i] = max(candies[i], ++nowCandy);
} else {
nowCandy = 1;
}
}
return accumulate(candies.begin(), candies.end(), 0);
}
};