6/01/2014

Leetcode -- Candy

Scan from both beginning and back, catch the strictly increasing and strictly decreasing ratings. When do the backward scan, be careful that if the current candy at location j is already greater than the expected candy, do not change it.
#include <iostream>  
 #include <vector>  
 using namespace std;  
 class Solution {  
 public:  
  int candy(vector<int> &ratings) {  
   int last = 0;  
   vector<int> candies(ratings.size(), 1);  
   for(int i = 1; i < ratings.size(); ++i) {  
    if(ratings[i] <= ratings[i - 1]) {  
     int num = 1;  
     for(int j = last; j < i; ++j) {  
      candies[j] = num++;  
     }  
     last = i;  
    }  
   }  
   int num = 1;  
   for(int j = last; j < ratings.size(); ++j) {  
    candies[j] = num++;  
   }  
   last = ratings.size() - 1;  
   for(int i = ratings.size() - 2; i >= 0; --i) {  
    if(ratings[i] <= ratings[i+ 1]) {  
     int num = 1;  
     for(int j = last; j > i; --j) {  
      candies[j] = candies[j] > num ? candies[j] : num++;  
     }  
     last = i;  
    }  
   }  
   num = 1;  
   for(int j = last; j >=0; --j) {  
    candies[j] = candies[j] > num ? candies[j] : num++;  
   }  
   int sum = 0;  
   for(int i = 0; i < candies.size(); ++i) {  
    sum+= candies[i];  
   }  
   return sum;  
  }  
 };  
 int main(int argc, char *argv[])  
 {  
  Solution s;  
  vector<int> ratings{2,2,1};  
  std::cout << s.candy(ratings) << std::endl;  
  return 0;  
 }  

No comments: