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;
    }
}
posted @ 2020-11-03 19:39  CodeSPA  阅读(61)  评论(0编辑  收藏  举报