考察点
贪心
思路
从左往右扫描一遍,贪心一次;然后从右往左扫描一遍,当当前位ratings小于左边一位ratings并且当前为nums大于左边一位nums时,要将左边一位赋值为当前位nums+1.
C++代码
class Solution {
public:
int candy(vector<int>& ratings) {
int size = ratings.size();
vector<int> nums(ratings.size(), 1);
int sum = 0;
for (int i=1; i<size; i++) {
if (ratings[i] > ratings[i-1]) {
nums[i] = nums[i-1] + 1;
}
}
for (int i = size - 1; i >0; i--) {
if (ratings[i] < ratings[i-1] && nums[i] >= nums[i-1])
nums[i - 1] = nums[i] + 1;
}
for (int i=0; i<size; i++) {
//cout<<nums[i]<<" ";
sum += nums[i];
}
return sum;
}
};
python代码:
class Solution:
def candy(self, ratings):
"""
:type ratings: List[int]
:rtype: int
"""
num_list = [1] * len(ratings)
for i in range(len(ratings) - 1):
if ratings[i+1] > ratings[i]:
num_list[i+1] = num_list[i] + 1
for i in range(len(ratings)-2, -1, -1):
if ratings[i] > ratings[i+1] and num_list[i] <=num_list[i+1]:
num_list[i] = num_list[i+1] + 1
return sum(num_list)