题目描述
给定一个整数数组 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,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~