Leetcode每日一题:845.longest-mountain-in-array(数组中的最长山脉)

在这里插入图片描述
思路:这道题可以设两个标志位up 和 down,分别表示上山状态经过上山后的下山状态,所以会遇到以下几种情况,分情况处理即可;
1、遇到上坡:

  • 下山状态down==true遇到上坡,说明前一个山脉已结束,更新max_count值;
  • 上山状态 or 平地后 遇到上坡,直接count++;

2、遇到下坡:

  • 上山状态up=true遇到下坡,count++;改变状态为下山up=false,down=true,开始下山;
  • 下山状态遇到下坡,count++,继续下山;
  • 平地后遇到下坡,除max_count外,其他值恢复初始情况,因为这不算个山脉,直接丢弃;

3、遇到平地:

  • 下山状态遇到平地,更新max_count值,其他值恢复初始情况,继续遍历;
  • 其它状态遇到平地,除max_count外,其他值恢复初始情况,因为这不算个山脉,直接丢弃;

另外注意:如果最后两个点是下坡,除了前面是平地的情况,其他情况都要更新max_count值;
在这里插入图片描述

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;
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页