class Solution { public: int candy(vector<int>& arr) { //记录每个位置的糖果数,初始为1 vector<int> nums(arr.size(), 1); //从左到右遍历 for(int i = 1; i < arr.size(); i++){ //如果右边在递增,每次增加一个 if(arr[i] > arr[i - 1]) nums[i] = nums[i - 1] + 1; } //记录总糖果数 int res = nums[arr.size() - 1]; //从右到左遍历 for(int i = arr.size() - 2; i >= 0; i--){ //如果左边更大但是糖果数更小 if(arr[i] > arr[i + 1] && nums[i] <= nums[i + 1]) nums[i] = nums[i + 1] + 1; //累加和 res += nums[i]; } return res; } }; // 思路感觉没错呀,错了错了,因为最小值可能有多个,而且这多个的最小值可能分布在不同相邻下标 // 所以不能用以下解法 // #include <numeric> // #include <vector> // class Solution { // public: // /** // * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 // * // * pick candy // * @param arr int整型vector the array // * @return int整型 // */ // int candy(vector<int>& arr) { // // write code here // // 找到arr中的最小值位置 // int index = min_element(arr.begin(),arr.end())-arr.begin(); // int left = index-1, right = index+1; // vector<int> temp(arr.size(),1); // while(left>=0) // { // if(arr[left]==arr[left+1]) // temp[left] = temp[left+1]; // else if(arr[left]>arr[left+1]) // temp[left] = temp[left+1]+1; // else // temp[left] = temp[left+1]-1; // --left; // } // while(right<arr.size()) // { // if(arr[right]==arr[right-1]) // temp[right] = temp[right-1]; // else if(arr[right]>arr[right-1]) // temp[right] = temp[right-1]+1; // else // temp[right] = temp[right-1]-1; // ++right; // } // int ans = accumulate(temp.begin(), temp.end(), 0); // return ans; // } // };