给定一个整数数组 arr
,如果它是有效的山脉数组就返回 true
,否则返回 false
。
让我们回顾一下,如果 arr
满足下述条件,那么它是一个山脉数组:
arr.length >= 3
- 在
0 < i < arr.length - 1
条件下,存在 i
使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
示例 1:
**输入:** arr = [2,1]
**输出:** false
示例 2:
**输入:** arr = [3,5,5]
**输出:** false
示例 3:
**输入:** arr = [0,3,2,1]
**输出:** true
提示:
1 <= arr.length <= 104
0 <= arr[i] <= 104
方法一:线性扫描
按题意模拟即可。我们从数组的最左侧开始向右扫描,直到找到第一个不满足 arr}[i] < \textit{arr}[i + 1] 的下标 i,那么 i 就是这个数组的最高点的下标。如果 i = 0 或者不存在这样的 i(即整个数组都是单调递增的),那么就返回 false。否则从 i 开始继续向右扫描,判断接下来的的下标 j 是否都满足 arr}[j] > \textit{arr}[j + 1],若都满足就返回 true,否则返回 false。
[sol1-Java]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public boolean validMountainArray(int[] arr) { int N = arr.length; int i = 0;
while (i + 1 < N && arr[i] < arr[i + 1]) { i++; }
if (i == 0 || i == N - 1) { return false; }
while (i + 1 < N && arr[i] > arr[i + 1]) { i++; }
return i == N - 1; } }
|
[sol1-Python3]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution: def validMountainArray(self, arr: List[int]) -> bool: N = len(arr) i = 0
while i + 1 < N and arr[i] < arr[i + 1]: i += 1
if i == 0 or i == N - 1: return False
while i + 1 < N and arr[i] > arr[i + 1]: i += 1
return i == N - 1
|
[sol1-C++]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Solution { public: bool validMountainArray(vector<int>& arr) { int N = arr.size(); int i = 0;
while (i + 1 < N && arr[i] < arr[i + 1]) { i++; }
if (i == 0 || i == N - 1) { return false; }
while (i + 1 < N && arr[i] > arr[i + 1]) { i++; }
return i == N - 1; } };
|
[sol1-JavaScript]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| var validMountainArray = function(arr) { const N = arr.length; let i = 0;
while (i + 1 < N && arr[i] < arr[i + 1]) { i++; }
if (i === 0 || i === N - 1) { return false; }
while (i + 1 < N && arr[i] > arr[i + 1]) { i++; }
return i === N - 1; };
|
[sol1-Golang]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| func validMountainArray(arr []int) bool { i, n := 0, len(arr)
for ; i+1 < n && arr[i] < arr[i+1]; i++ { }
if i == 0 || i == n-1 { return false }
for ; i+1 < n && arr[i] > arr[i+1]; i++ { }
return i == n-1 }
|
[sol1-C]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| bool validMountainArray(int* arr, int arrSize) { int i = 0;
while (i + 1 < arrSize && arr[i] < arr[i + 1]) { i++; }
if (i == 0 || i == arrSize - 1) { return false; }
while (i + 1 < arrSize && arr[i] > arr[i + 1]) { i++; }
return i == arrSize - 1; }
|
复杂度分析