欧买噶,第一次自己做出了middle,鸡冻!!
我是强行模拟爬山过程,用类似贪心的思想,每次记下最长山脉。代码看起来很长,其实思路很单纯的!然后我发现像这种模拟其实挺麻烦的,需要各种数据来检错,覆盖所有情况。。
class Solution {
public:
int longestMountain(vector<int>& A) {
int len=A.size();
if(len<3) return 0;
int maxlen=0, cur=0, up=0, down=0;
for(int i=1;i<len;++i){
if(A[i]>A[i-1]){
if(!up){ //up=0:还没有上山
up=1;
cur++;
}
else if(!down) cur++; //up=1,down=0:正在上山
else{ //up=1,down=1:正在下山
cur++;
maxlen=max(maxlen, cur); //前一次上下山结束,新一次上山开始
up=1;
down=0;
cur=1; //注意这里cur已经是1
}
}else if(A[i]==A[i-1]){
if(!up) continue; //up=0:还没有上山
else if(!down){ //up=1,down=0:正在上山
up=0;
cur=0;
}else{ //up=1,down=1:正在下山
cur++; //因为每次开始上山是从第二个数开始cur++的,所以最后还要cur++
maxlen=max(maxlen, cur); //前一次上下山结束
up=0;
down=0;
cur=0;
}
}else{
if(!up) continue; //up=0:还没有上山
else if(!down){ //up=1,down=0:正在上山
down=1;
cur++;
}
else cur++; //up=1,down=1:正在下山
}
}
if(cur && up && down) cur++; //最后一个数在下山。与前面下山结束时的cur++同理
else cur=0; //最后一个数没有在下山,没有形成山脉
return max(maxlen, cur);
}
};