LeetCode101 질문 작성 노트 - 탐욕 알고리즘

135.사탕(딱딱한)

  • 습관

아이디어

  • 내 생각은
    각 사탕 배열을 사용하여 각 어린이의 사탕 수를 저장하고 처음부터 끝까지 순회하는 것입니다.나중에 감소하면 현재 어린이의 사탕 수 + 1. 같은 점수에 도달하면 중단됩니다. 증가하기 시작하는 무언가를 만나면 해당 어린이의 사탕 수를 +1 늘립니다.
  • 문제
    잘못된 생각이에요! 탐욕스러운 알고리즘 아닌가요? !
  • 올바른 생각은
    규칙을 두 방향, 즉 왼쪽 규칙과 오른쪽 규칙으로 나누는 것입니다. 두 가지 규칙을 모두 만족시키면 됩니다.

벌레

  • 배열 오버플
    로 C++ 구문에서 **sizeof와 size()는 완전히 다릅니다! **배열의 요소 수를 얻으려면 sizeof가 아닌 size()를 사용해야 합니다! ! ! !

풀다

  • 내 잘못된 해결책( 배열 오버플로 )
class Solution {
    
    
public:
    int candy(vector<int>& ratings) {
    
    
        int n = ratings.length();
        int candy = 0;	//初始化candy数目是0
		int eachcandy[n];	//存储当前孩子的糖果数量
		for(int i = 0;i < n; ++i)
			eachcandy[i] = 1;	//初始化为1
		for(int i = 0; i < n;i++){
    
    
			for(int j = 1; j < n-i;++j){
    
    
				if(ratings[i+j-1] <= ratings[i+j]){
    
    
					break;
				}
				else
					eachcandy[i]++;
			}
		}
		for(int i = 0; i < n; ++i)
			candy+=eachcandy[i];
		return candy;
    }
};
  • 정답
class Solution {
    
    
public:
    int candy(vector<int>& ratings) {
    
    
        int n = ratings.size();
        vector<int> left(n);
        for (int i = 0; i < n; i++) {
    
    
            if (i > 0 && ratings[i] > ratings[i - 1]) {
    
    
                left[i] = left[i - 1] + 1;
            } else {
    
    
                left[i] = 1;
            }
        }
        int right = 0, ret = 0;
        for (int i = n - 1; i >= 0; i--) {
    
    
            if (i < n - 1 && ratings[i] > ratings[i + 1]) {
    
    
                right++;
            } else {
    
    
                right = 1;
            }
            ret += max(left[i], right);
        }
        return ret;
    }
};

Guess you like

Origin blog.csdn.net/ZHorcrux/article/details/128705782