Leetcode una pregunta diaria: 845.longest-mountain-in-array (la montaña más larga de la matriz)

Inserte la descripción de la imagen aquí
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==trueencuentra 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=trueencuentra cuesta abajo, count++;改变状态为下山up=false,down=truecomienza 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;
Inserte la descripción de la imagen aquí

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;
}

Supongo que te gusta

Origin blog.csdn.net/wyll19980812/article/details/109277254
Recomendado
Clasificación