1、算法思路

把所有孩子的糖果数初始化为 1;先从左往右遍历一遍,如果右边孩子的评分比左边的高,则右边孩子的糖果数更新为左边孩子的糖果数加 1;再从右往左遍历一遍,如果左边孩子的评分比右边的高,且左边孩子当前的糖果数不大于右边孩子的糖果数,则左边孩子的糖果数更新为右边孩子的糖果数加 1。通过这两次遍历,分配的糖果就可以满足题目要求了。这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一侧的大小关系。

比如对于样例[1, 1, 2]。从左到右遍历一遍糖果数组为[1,1,2]。从右往左遍历一遍糖果数组为[1,1,2]。故返回总和4。

2、代码实现

class Solution {
public:
    /**
     * pick candy
     * @param arr int整型vector the array
     * @return int整型
     */
    int candy(vector<int>& arr) {
        if(arr.size() == 0) return 0;
        vector<int> res(arr.size(), 1);
        //从左往右遍历
        for(int i = 0; i < arr.size() - 1; ++i)
        {
        	if(arr[i + 1] > arr[i]) res[i + 1] = res[i] + 1;
        }
        //从右往左遍历
        for(int i = arr.size() - 1; i > 0; i--)
        {
        	if(arr[i -1] > arr[i] && res[i - 1] <= res[i]) res[i - 1] = res[i] + 1;
        }
        //返回糖果数组和
        int sum = 0;
        for(auto i : res) sum += i;
        return sum; 
    }
};