zoukankan      html  css  js  c++  java
  • Longest Mountain in Array 数组中的最长山脉

    我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:

    • B.length >= 3
    • 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)

    给出一个整数数组 A,返回最长 “山脉” 的长度。

    如果不含有 “山脉” 则返回 0。

    示例 1:

    输入:[2,1,4,7,3,2,5]
    输出:5
    解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。

    示例 2:

    输入:[2,2,2]
    输出:0
    解释:不含 “山脉”。

    提示:

    0 <= A.length <= 10000
    0 <= A[i] <= 10000


    解题思路:

    由于只能扫描一次,所以要判断出哪些点不能作为山头,而且要能区别不同的山头(包括上坡段和下坡段),我们从头扫描数组,记录两个变量up和down,记录到当前下标i时,上坡和下坡有多长。up和down在以下两个条件成立时会被归为0。

    A[i - 1] == A[i] or ( down > 0 && A[i - 1] < A[i] )

    条件的意思是如果前后两个值相等A[i - 1] == A[i],那么不管是上坡还是下坡截止到当前第i个元素得到的up和down都是无效的,所以必须归为0。如果当前正在下坡路段down>0但是突然有个元素不满足下坡时后一个元素小于前一个元素的特性(A[i - 1] < A[i] ),那么就证明第i个元素已经是坡底元素的下一个元素了,不属于这个山头,所以up和down要归零。


    参考代码:

     1 class Solution
     2 {
     3 public:
     4     int longestMountain(vector<int>& A) 
     5     {
     6       int up = 0, down = 0;
     7       int res = 0;
     8       for (int i = 1; i < A.size(); i++) 
     9       {
    10           if ((down > 0 && A[i] > A[i - 1]) || (A[i] == A[i - 1])) up = down = 0;
    11           up += A[i] > A[i - 1];
    12           down += A[i] < A[i - 1];
    13           if(up && down) res=max(res,up+down+1); // 在up和down都不为0时才进入
    14       }
    15       return res;
    16     }
    17 };        
  • 相关阅读:
    linux 内存映射-ioremap和mmap函数
    vue 模板语法-插值的操作(12-22)
    chrome浏览器json插件
    vue初识(1-11)2020-10-27
    后盾人:JS课程第一章(11-18)2020-10-25
    博客园美化
    chrome 设置自动刷新网页
    二叉树的层次遍历
    poj 2905 双向队列(待补充)
    poj 2159 D
  • 原文地址:https://www.cnblogs.com/WPF-342201/p/11385821.html
Copyright © 2011-2022 走看看