本文主要是介绍[力扣题解]135. 分发糖果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[困难] 题目:135. 分发糖果
思路
贪心法
代码
// 贪心
// Step 1 : 从左往右
// Step 2 : 从右往左
class Solution {
public:int candy(vector<int>& ratings) {int i, size = ratings.size(), sum = 0;vector<int> candy(size, 1); // 基础是1个for(i = 0; i < size-1; i++){// 右边孩子分高些if(ratings[i] < ratings[i+1]){// 从左往右,依据左边candy[i+1] = candy[i] + 1;}}for(i = size-1; i > 0; i--){if(ratings[i-1] > ratings[i]){// 从右往左,依据右边candy[i-1] = max(candy[i] + 1, candy[i-1]);// 为什么要用 max 呢?}}for(i = 0; i < size; i++){sum += candy[i];}return sum;}
};
- (1)为什么第一次for循环从左到右,下一次从右到左?
这两次for循环方向相反,有一点像动态规划。从左到右是因为比较的时候要用到左边的元素,所以从左到右,从右到左同理; - (2)为什么要用max?
因为不这样,上一个从左到右的for就白费了,要保证既大于右边的(上一次for循环比较的结果不能丢),又大于左边的(这次比较的结果)
这篇关于[力扣题解]135. 分发糖果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!