• 数组中的最长山脉【845】


    我们把数组 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] == A[i + 1] or ( down > 0 && A[i] < A[i +1] )
          条件的意思是如果前后两个值相等A[i] == A[i+1],那么不管是上坡还是下坡截止到当前第i个元素得到的up和down都是无效的,所以必须归为0。如果当前正在下坡路段down>0
    但是突然有个元素不满足下坡时后一个元素小于前一个元素的特性(A[i] < A[i+1] ),那么就证明第i个元素已经是坡底元素的下一个元素了,不属于这个山头,所以up和down要归零。
    注意:在计算出所有的up以及down之后,我们就可以枚举山顶。需要注意的是,只有当 up 和 down均大于0 时,A[i] 才能作为山顶,并且山脉的长度为 up+down+1。
    

    代码:

    class Solution {
        public int longestMountain(int[] A) {
            int len = A.length;
            if(len < 3){
                return 0;
            }
            int up = 0, down =0;
            int res = 0;
            for(int i = 0;i < len-1; i++){
               if((A[i] == A[i+1]) || (down > 0 && A[i] < A[i+1])){
                    up = down = 0;
               }  
               if(A[i] < A[i+1]){
                   up++;
                }
                if(A[i] > A[i+1]){
                    down++;
                }
                if(up > 0 && down > 0){
                    res = Math.max(res, up + down + 1);
                }   
            }
            return res;
        }
    }
    
  • 相关阅读:
    ubuntu安装gradle
    ubuntu文件查找
    接口服务flask的负载均衡部署
    区块链节点网络的nginx转发部署
    typescript检查包之间是否有循环依赖
    shiro对事务的影响
    防止xss(脚本攻击)的方法之过滤器
    Mysql批量更新速度慢的解决方案
    springBoot的三种启动方式
    mybatis的注解开发之三种动态sql
  • 原文地址:https://www.cnblogs.com/snail-gao/p/13874723.html
Copyright © 2020-2023  润新知