【LeetCode_941】有效的山脉数组_Python&Java_线性查找解法

题目描述

给定一个整数数组 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]
在这里插入图片描述

示例 1:
输入:[2,1]
输出:false
示例 2:
输入:[3,5,5]
输出:false
示例 3:
输入:[0,3,2,1]
输出:true
提示:
0 <= A.length <= 10000
0 <= A[i] <= 10000

方法一、暴力求解

我太菜了!!一般最先想到的就是暴力,而且还没解答出来,这部分是我的错误之路,可以跳过直接看方法二

Python解法

起初打算以i两边的列表是否有序作为判断依据(但是最后证明这个思路也不行)

class Solution(object):
    def validMountainArray(self, A):
        """
        :type A: List[int]
        :rtype: bool
        """
        n = len(A)
        i = 1
        if(n<3):
            return False
        while(i>0 and i<n-1):
            temp1 = A[:i+1]
            temp2 = A[i:]
            if(temp1 == temp1.sort() and temp2.reverse() == temp2.sort()):
                return True
            i = i+1
        return False

但是方法temp1.sort()是一个操作而非返回一个列表,所以就定义了一堆列表试试。所以改成

class Solution(object):
    def validMountainArray(self, A):
        """
        :type A: List[int]
        :rtype: bool
        """
        n = len(A)
        i = 1
        if(n<3):
            return False
        while(i>0 and i<n-1):
            temp1 = A[:i+1]
            temp2 = A[i:]
            l1 = temp1
            l2 = temp2
            temp1.sort()
            l3 = temp1#排序后的temp1
            temp2.reverse()
            l4 = temp2#倒序后的temp2
            l2.sort()
            l5 = l2#排序后的temp2
            if(l1 == l3 and l4 == l5):
                return True
            i = i+1
        return False

在这里插入图片描述
3,5,5 [3,5]和[5,5],右边的列表也是有序的呀…所以这个方法行不通o(╥﹏╥)o

方法二、线性查找i

参考官方解答
思路: 我们从数组的最左侧开始向右扫描,直到找到第一个不满足 A[i] < A[i + 1]的下标 i,那么 i就是这个数组的最高点的下标。如果 i = 0或者不存在这样的 i(即整个数组都是单调递增的),那么就返回false。否则从 i开始继续向右扫描,判断接下来的的下标 j是否都满足 A[j] > A[j + 1],若都满足就返回 true,否则返回false。

Python解法

class Solution(object):
    def validMountainArray(self, A):
        N = len(A)
        i = 0

        # 递增扫描
        while i + 1 < N and A[i] < A[i + 1]:
            i += 1

        # 最高点不能是数组的第一个位置或最后一个位置
        if i == 0 or i == N - 1:
            return False

        # 递减扫描
        while i + 1 < N and A[i] > A[i + 1]:
            i += 1

        return i == N - 1#走到最后则符合要求,中途停下来了则返回False

耗时168ms

Java解法

class Solution {
    public boolean validMountainArray(int[] A) {
        int N = A.length;
        int i = 0;

        // 递增扫描
        while (i + 1 < N && A[i] < A[i + 1]) {
            i++;
        }

        // 最高点不能是数组的第一个位置或最后一个位置
        if (i == 0 || i == N - 1) {
            return false;
        }

        // 递减扫描
        while (i + 1 < N && A[i] > A[i + 1]) {
            i++;
        }

        return i == N - 1;
    }
}

耗时1ms

复杂度分析

时间复杂度:O(N)
空间复杂度:O(1)

博主比较小白,但是热爱分享。一直感觉自己写代码的能力,算法能力都不太行,所以最近开始刷LeetCode,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂java杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值