《重启22》
枚举法-寻找最长山脉
题目
示例 1:
输入:arr = [2,1,4,7,3,2,5]
输出:5
解释:最长的山脉子数组是 [1,4,7,3,2],长度为 5。
示例 2:
输入:arr = [2,2,2]
输出:0
解释:不存在山脉子数组。
来源:力扣(LeetCode)
具体代码(带注解)
/**
* @Author: czzf
* @Description: TODO
* @DateTime: 2022/9/5 9:31
**/
/*----寻找最长山脉--------*/
public class 寻找最长山脉 {
public static int longestMountain(int[] arr) {
int ans = 0, l = 0, n = arr.length;
while (l < n - 1) {
//先找到起点的最低点l(如果是前面大于后面就往前跳)
while (l < n - 1 && arr[l] >= arr[l + 1]) {
l++;
}
//设立起点
int r = l;
//找到第一个下降的转折点(山顶)(如果前面小于后面这时就是没到顶往前跳)
while (r < n - 1 && arr[r] < arr[r + 1]) {
r++;
}
//这个是顶点位置
int mid = r;
//在判断一次是否是顶点然后顶点后面还有数字,如果没有就没有意义比如情况是:9 8 7 6 7
if (r < n - 1 && arr[r] > arr[r + 1]) {
//此时找到的r确实是真正的山顶左右都有开始找右边有多长:
while (r < n - 1 && arr[r] > arr[r + 1]) {
r++;
}
ans = Math.max(ans, r - l + 1);
}
//继续对上位置,然后遍历下去
l = r;
}
return ans;
}
public static void main(String[] args) {
// System.out.println(longestMountain(new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}));
// System.out.println(longestMountain(new int[]{0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0}));
// System.out.println(longestMountain(new int[]{9,8,7,6,7 ,8 ,7}));
System.out.println(longestMountain(new int[]{8, 8 ,8, 9, 9 ,9}));
}
}