- 算法:twoPass
- 1.空间换取时间
- 2.up数组记录前面有多少个连续比自己小的数,down数组记录后面有多少个连续比自己小的数
- 3.第二次遍历计算最长山脉长度
public int longestMountain(int[] A) { int N = A.length; int[] up = new int[N]; int[] down = new int[N]; for (int i = 1; i < A.length; i++) { if (A[i] > A[i-1]) { up[i] = up[i-1] + 1; } if (A[N-i-1] > A[N-i]) { down[N-i-1] = down[N-i] + 1; } } int length = 0; for (int i = 1; i < A.length - 1; i++) { if (up[i] > 0 && down[i] > 0) { length = Math.max(length, up[i] + down[i] + 1); } } return length; }
- 算法-onePass
- 1.遍历每一个元素作为山脉的起始位置,计算山脉的长度
- 2.下一个山脉的起始位置是上一个山脉的结束位置,优化时间
public int longestMountain(int[] A) { int length = 0; for (int i = 0; i < A.length - 2; i++) { if (A[i+1] > A[i]) { int upper = i + 1; while (upper + 1 < A.length && A[upper + 1] > A[upper]) { upper++; } int lower = upper + 1; if (lower < A.length && A[lower] != A[upper]) { while (lower + 1 < A.length && A[lower + 1] < A[lower]) { lower++; } length = Math.max(length, lower - i + 1); i = lower - 1; } } } return length; }