zoukankan      html  css  js  c++  java
  • LeetCode 941 有效的山脉数组

    LeetCode 941 有效的山脉数组

    问题描述:
    给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。
    让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:

    • A.length >= 3
    • 在 0 < i < A.length - 1 条件下,存在 i 使得:
      • A[0] < A[1] < ... A[i-1] < A[i]
      • A[i] > A[i+1] > ... > A[A.length - 1]

    中心扩散

    • 由当前遍历位置向两边扩散,验证该位置是否为峰顶
    class Solution {
        public boolean validMountainArray(int[] A) {
            if(A==null || A.length<3) {
                return false;
            }
            //中心扩散法O(N2)
            for(int i=1; i<A.length-1; i++) {
                if(A[i-1]<A[i] && A[i]>A[i+1]) {
                    if(centerToSides(A, i)) {
                        return true;
                    }
                }
            }
    
            return false;
        }
    
        public boolean centerToSides(int[] A, int center) {
            int left = center-1, right = center+1;
            while(left>=0 || right<A.length) {
                if((left>=0 && A[left]>=A[left+1]) ||
                    (right<A.length && A[right-1]<=A[right])) {
                        return false;
                }
                left--;
                right++;
            }
            
            return left<0 && right>=A.length;
        }
    }
    

    一次遍历:使用状态标志

    class Solution {
        public boolean validMountainArray(int[] A) {
            if(A==null || A.length==0) {
                return false;
            }
    
            boolean isRise = false;
            int peakCount = 0;
            for(int curr=1; curr<A.length; curr++) {
                //下降变上升
                if(!isRise && A[curr-1]<A[curr]) {
                    //不是在一开始上升
                    if(curr-1>0) {
                        return false;
                    }
                    //System.out.println("上升处: "+(curr-1));
                    isRise = !isRise;
                    peakCount++;
                    //超过两个山峰则返回false
                    if(peakCount>1) {
                        //System.out.println("返回处: "+"if(peakCount>1)");
                        return false;
                    }
                }
                //上升变下降
                else if(isRise && A[curr-1]>A[curr]) {
                    //System.out.println("下降处: "+(curr-1));
                    isRise = !isRise;
                }
                else if(A[curr-1]==A[curr]) {
                    //System.out.println("返回处: "+"else {");
                    return false;
                }
            }
    
            //System.out.println("返回处: "+"return peakCount==1;");
            return peakCount==1 && !isRise;
        }
    }
    
  • 相关阅读:
    C# 文本,图片 与 Base64的相互转换
    vue3.x 中的自定义组件及使用
    vue 的TodoList 小Demo
    vue中的条件渲染 v-show、v-if、v-else、v-else-if
    vue 使用$refs获取表单内容及v-model双向数据绑定
    python-异常处理&操作数据库&网络编程
    python-接口开发
    python-数据库&邮件
    python-函数和模块
    python-函数&list&dic&集合&文件读取
  • 原文地址:https://www.cnblogs.com/CodeSPA/p/13922055.html
Copyright © 2011-2022 走看看