LeetCode135:Candy

4723 단어 LeetCode
제목:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

  • What is the minimum candies you must give?
    문제 해결 방법:
    두 번 반복해서 그룹을 세면 된다
    첫 번째: 현재 원소가 이전보다 크면 현재 아이가 얻은 사탕 수는 이전 아이의 사탕 수+1이고, 그렇지 않으면 사탕 수는 1이다
    두 번째: 뒤에서 앞으로 스캔하면 현재 원소 i의 값이 i+1 위치의 값보다 크면 이들의 현재 사탕 수를 비교한다. 만약에 i아이가 얻은 사탕 수가 i+1아이가 얻은 사탕 수+1보다 크면 변하지 않는다. 그렇지 않으면 i아이의 사탕 수를 i+1아이의 사탕 수+1로 설정한다.
    구현 코드:
    #include <iostream>
    
    #include <vector>
    
    using namespace std;
    
    
    
    class Solution {
    
    public:
    
        int candy(vector<int> &ratings) {
    
            int len = ratings.size();
    
            if(len == 0 || len == 1)
    
                return len;
    
            int *c = new int[len];
    
            c[0] = 1;
    
            for(int i = 1; i < len; i++)
    
                if(ratings[i] > ratings[i-1])
    
                    c[i] = c[i-1] + 1;
    
                else
    
                    c[i] = 1;
    
            int minCandy = c[len-1];
    
            for(int i = len-2; i >= 0; i--)
    
            {
    
                if(ratings[i] > ratings[i+1])
    
                    c[i] = max(c[i], c[i+1] + 1);
    
                minCandy += c[i];            
    
            }
    
            return minCandy;
    
            
    
        }
    
    };
    
    
    
    int main(void)
    
    {
    
        int ratings[] = {5,8,2,4,9,5,4};
    
        int len = sizeof(ratings) / sizeof(ratings[0]);
    
        vector<int> ratVec(ratings, ratings+len);
    
        Solution solution;
    
        int ret = solution.candy(ratVec);
    
        cout<<ret<<endl;
    
        return 0;
    
    }

    좋은 웹페이지 즐겨찾기