思路:这道题可以设两个标志位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;
}