내 생각은 각 사탕 배열을 사용하여 각 어린이의 사탕 수를 저장하고 처음부터 끝까지 순회하는 것입니다.나중에 감소하면 현재 어린이의 사탕 수 + 1. 같은 점수에 도달하면 중단됩니다. 증가하기 시작하는 무언가를 만나면 해당 어린이의 사탕 수를 +1 늘립니다.
문제 잘못된 생각이에요! 탐욕스러운 알고리즘 아닌가요? !
올바른 생각은 규칙을 두 방향, 즉 왼쪽 규칙과 오른쪽 규칙으로 나누는 것입니다. 두 가지 규칙을 모두 만족시키면 됩니다.
벌레
배열 오버플 로 C++ 구문에서 **sizeof와 size()는 완전히 다릅니다! **배열의 요소 수를 얻으려면 sizeof가 아닌 size()를 사용해야 합니다! ! ! !
풀다
내 잘못된 해결책( 배열 오버플로 )
classSolution{
public:intcandy(vector<int>& ratings){
int n = ratings.length();int candy =0;//初始化candy数目是0int eachcandy[n];//存储当前孩子的糖果数量for(int i =0;i < n;++i)
eachcandy[i]=1;//初始化为1for(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;}};
정답
classSolution{
public:intcandy(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;}};