Main reference: http://zhaohongze.com/wordpress/2013/12/10/leetcode-candy/
I was confused by the constraint on BOTH sides of an element. Strategy is: splitting the 2 constraints into 2 single constraintm, so one linear scan from left, and the other linear scan from right.
Algorithmic thought beats coding skills!
class Solution { public: int candy(vector<int> &ratings) { vector<int> cnt(ratings.size(), 1); // From left to right for (int i = 1; i < ratings.size(); i++) if (ratings[i - 1] < ratings[i]) cnt[i] = cnt[i - 1] + 1; // From left to right for (int i = ratings.size() - 2; i >= 0; i--) if (ratings[i + 1] < ratings[i] && cnt[i] <= cnt[i + 1]) cnt[i] = cnt[i + 1] + 1; return std::accumulate(cnt.begin(), cnt.end(), 0); } };