题目
给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。 让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:
(1)A.length >= 3
(2)在 0 < i < A.length - 1 条件下,存在 i 使得:
- A[0] < A[1] < … A[i-1] < A[i]
- A[i] > A[i+1] > … > A[A.length - 1]
分析
首先是读懂题!!!我又没有读懂题,然后又跟之前做的那道“数组中的最长山脉” 搞混淆了
这道题说的是山脉数组,那么整个数组A的元素都得满足条件,成一个山脉状。
思路一
遍历数组,找到山顶的位置,然后设置left和right ,left往左遍历,right往右遍历,最后left和right到达的位置,应该是0和A.length-1,我们设置len= right-left +1 ,看 len是否和数组的长度一致,一致为true,否则false。
public boolean validMountainArray(int[] A) {
if (A.length < 3) {
return false;
}
int len = 0;
for (int i = 1; i < A.length - 1; i++) {
if (A[i] > A[i - 1] && A[i] > A[i + 1]) {
int left = i - 1;
int right = i + 1;
while (left > 0 && A[left] > A[left - 1]) {
left--;
}
while (right < A.length - 1 && A[right] > A[right + 1]) {
right++;
}
len = right - left + 1;
}
}
return len >= 3 && len == A.length;
}
思路二
既然判断整个数组是否符合条件,那么我就设置一个变量 i,让 i 从0 开始往右移动,如果 i 最后能到达数组的最后一个位置,那么即满足题意。
但是要处理好细节:山顶的位置不能是第一个和最后一个
public boolean validMountainArray2(int[] A) {
int len = A.length;
int i = 0;
// 递增
while (i + 1 < len && A[i] < A[i + 1]) {
i++;
}
// 循环结束时,i到山顶
// 但是要判断山顶的位置——不能是数组的第一个位置或最后一个位置
if (i == 0 || i == len - 1) {
return false;
}
// 继续看后面的部分是否符合
while (i + 1 < len && A[i] > A[i + 1]) {
i++;
}
// 题目说:0 < i < A.length - 1
// 也就是整个数组得成山脉状
return i == len - 1;
}
更新!!
思路三
left从0开始,right从最后一个元素开始,left往右找,right往左找,如果是山脉数组,那么left和right会相遇。
public boolean validMountainArray(int[] A) {
int left = 0, right = A.length - 1;
while (left < A.length - 1 && A[left] < A[left + 1]) {
left++;
}
while (0 < right && A[right - 1] > A[right]) {
right--;
}
return left > 0 && right < A.length - 1 && left == right;
}
做题反思
读懂题!读懂题!
理解与思考!先有一个大概的思路,确保思路是正确的,不然写了半天,也是白干,不如一开始思考清楚。
end.