Skip to content

Commit a725c0d

Browse files
author
wangpeng
committed
feat(MEDIUM): 978_maxTurbulenceSize
1 parent 5d25d2a commit a725c0d

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package pp.arithmetic.leetcode;
2+
3+
/**
4+
* Created by wangpeng on 2019-03-29.
5+
* 978. 最长湍流子数组
6+
* <p>
7+
* 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:
8+
* <p>
9+
* 若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1];
10+
* 或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。
11+
* 也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
12+
* <p>
13+
* 返回 A 的最大湍流子数组的长度。
14+
* <p>
15+
* <p>
16+
* <p>
17+
* 示例 1:
18+
* <p>
19+
* 输入:[9,4,2,10,7,8,8,1,9]
20+
* 输出:5
21+
* 解释:(A[1] > A[2] < A[3] > A[4] < A[5])
22+
* 示例 2:
23+
* <p>
24+
* 输入:[4,8,12,16]
25+
* 输出:2
26+
* 示例 3:
27+
* <p>
28+
* 输入:[100]
29+
* 输出:1
30+
* <p>
31+
* <p>
32+
* 提示:
33+
* <p>
34+
* 1 <= A.length <= 40000
35+
* 0 <= A[i] <= 10^9
36+
*
37+
* @see <a href="https://leetcode-cn.com/problems/longest-turbulent-subarray/">longest-turbulent-subarray</a>
38+
*/
39+
public class _978_maxTurbulenceSize {
40+
41+
public static void main(String[] args) {
42+
_978_maxTurbulenceSize size = new _978_maxTurbulenceSize();
43+
System.out.println(size.maxTurbulenceSize(new int[]{9, 4, 2, 10, 7, 8, 8, 1, 9}));
44+
System.out.println(size.maxTurbulenceSize(new int[]{4, 8, 12, 16}));
45+
System.out.println(size.maxTurbulenceSize(new int[]{4, 4}));
46+
System.out.println(size.maxTurbulenceSize(new int[]{4, 4, 4}));
47+
}
48+
49+
/**
50+
* 解法二:代码简化了解法一的行数,窗口的思想
51+
* 先确定一个起始锚点anchor,再确定一个终止的点,两点相减得到区间长度
52+
*
53+
* @param A
54+
* @return
55+
*/
56+
public int maxTurbulenceSize2(int[] A) {
57+
int N = A.length;
58+
int ans = 1;
59+
int anchor = 0;
60+
61+
for (int i = 1; i < N; ++i) {
62+
int c = Integer.compare(A[i - 1], A[i]);
63+
if (i == N - 1 || c * Integer.compare(A[i], A[i + 1]) != -1) {
64+
if (c != 0) ans = Math.max(ans, i - anchor + 1);
65+
anchor = i;
66+
}
67+
}
68+
69+
return ans;
70+
}
71+
72+
/**
73+
* 简单解法:一次遍历,通过多个变量控制循环累加
74+
*
75+
* @param A
76+
* @return
77+
*/
78+
public int maxTurbulenceSize(int[] A) {
79+
if (A.length <= 1) {
80+
return A.length;
81+
}
82+
int max = 1;
83+
int subMax = 0;
84+
boolean isAccumlation = false;
85+
int preMinus = 0;
86+
for (int i = 1; i < A.length; i++) {
87+
int minus = A[i] - A[i - 1];
88+
if (minus == 0) {
89+
max = Math.max(max, subMax);
90+
isAccumlation = false;
91+
continue;
92+
}
93+
if (!isAccumlation) {
94+
preMinus = minus;
95+
subMax = 2;
96+
isAccumlation = true;
97+
continue;
98+
}
99+
if (preMinus > 0 ^ minus > 0) {
100+
//替换
101+
subMax++;
102+
preMinus = minus;
103+
} else {
104+
//结束,重新计数
105+
max = Math.max(max, subMax);
106+
preMinus = minus;
107+
subMax = 2;
108+
}
109+
}
110+
max = Math.max(max, subMax);
111+
112+
return max;
113+
}
114+
}

0 commit comments

Comments
 (0)