Idea: esta pregunta se puede establecer con dos banderas up 和 down
, que indican respectivamenteCuesta arribaconCuesta abajo después de ir cuesta arribaPor lo tanto, se encontrará con las siguientes situaciones, que se pueden abordar de acuerdo con la situación:
1. Encuentro cuesta arriba:
- Cuando el estado cuesta abajo
down==true
encuentra una cuesta arriba, significa que la cadena montañosa anterior ha terminado Actualice el valor max_count; - Después de ir cuesta arriba o en terreno llano, si encuentra una cuesta arriba, cuente ++ directamente;
2. Encontrado cuesta abajo:
- Cuando el estado cuesta arriba se
up=true
encuentra cuesta abajo,count++;改变状态为下山up=false,down=true
comienza a descender; - Cuando el estado cuesta abajo se encuentra con una cuesta abajo,
count++
continúe bajando la montaña; - Después de nivelar el terreno y encontrar una cuesta abajo, los valores distintos a max_count se restablecerán a las condiciones iniciales, porque no se trata de una cordillera, por lo que deséchela directamente;
3. Encuentro con terreno llano:
- Cuando el estado cuesta abajo encuentra un terreno plano, actualice el valor de conteo máximo, restaure otros valores a la situación inicial y continúe atravesando;
- Cuando otros estados encuentran terreno llano, excepto max_count, otros valores regresan a la situación inicial, porque esta no es una cadena montañosa, así que deséchela directamente;
También tenga en cuenta: si los dos últimos puntos son cuesta abajo, el valor de max_count debe actualizarse en todos los demás casos excepto en el terreno plano;
int longestMountain(vector<int> &A)
{
int len = A.size();
if (len <= 2)
{
return 0;
}
int count = 1, max_count = 0;
bool up = false, down = false; //down标记是否为经过上山后的下山状态,up标记为上山状态
for (int i = 1; i < len; i++)
{
//上坡
if (A[i] > A[i - 1])
{
//如果下山(经过上山后)状态遇到上坡,说明前一个山脉终止
if (down)
{
max_count = count > max_count ? count : max_count;
down = false;
count = 1;
}
up = true; //更改状态为上坡
//否则为上山状态遇到上坡,继续往上爬
count++;
}
//下坡
else if (A[i] < A[i - 1])
{
//如果下山(经过上山后)状态遇到下坡
if (down)
{
count++;
if (i == len - 1)
{
max_count = count > max_count ? count : max_count;
}
continue;
}
//如果为上山状态遇到下坡
if (up)
{
down = true; //改为下山状态
up = false;
count++;
if (i == len - 1)
{
max_count = count > max_count ? count : max_count;
}
continue;
}
}
else //遇到平地
{
if (down)//如果是下山(经过上山后)状态遇到的平地,则要更新最大值
{
max_count = count > max_count ? count : max_count;
}
//一直是平地或者上山后遇到平地,都不用更新最大值,因为不符合题意;
count = 1;
up = false;
down = false;
}
}
return max_count;
}