Skip to content

Commit 9cc8c47

Browse files
committed
fix 0978: update a clearer solution
1 parent f0792d1 commit 9cc8c47

File tree

3 files changed

+97
-102
lines changed

3 files changed

+97
-102
lines changed
Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package leetcode
22

33
// 解法一 模拟法
4-
func maxTurbulenceSize(A []int) int {
4+
func maxTurbulenceSize(arr []int) int {
55
inc, dec := 1, 1
6-
maxLen := min(1, len(A))
7-
for i := 1; i < len(A); i++ {
8-
if A[i-1] < A[i] {
6+
maxLen := min(1, len(arr))
7+
for i := 1; i < len(arr); i++ {
8+
if arr[i-1] < arr[i] {
99
inc = dec + 1
1010
dec = 1
11-
} else if A[i-1] > A[i] {
11+
} else if arr[i-1] > arr[i] {
1212
dec = inc + 1
1313
inc = 1
1414
} else {
@@ -35,23 +35,21 @@ func min(a int, b int) int {
3535
}
3636

3737
// 解法二 滑动窗口
38-
func maxTurbulenceSize1(A []int) int {
39-
if len(A) == 1 {
40-
return 1
38+
func maxTurbulenceSize1(arr []int) int {
39+
var maxLength int
40+
if len(arr) == 2 && arr[0] != arr[1] {
41+
maxLength = 2
42+
} else {
43+
maxLength = 1
4144
}
42-
// flag > 0 代表下一个数要大于前一个数,flag < 0 代表下一个数要小于前一个数
43-
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0]
44-
for left < len(A) {
45-
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) {
46-
right++
47-
flag = lastNum - A[right]
48-
lastNum = A[right]
49-
} else {
50-
if flag != 0 {
51-
res = max(res, right-left+1)
52-
}
53-
left++
45+
left := 0
46+
for right := 2; right < len(arr); right++ {
47+
if arr[right] == arr[right-1] {
48+
left = right
49+
} else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
50+
left = right - 1
5451
}
52+
maxLength = max(maxLength, right-left+1)
5553
}
56-
return max(res, 1)
54+
return maxLength
5755
}
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,58 @@
1-
# [978. Longest Turbulent Subarray](https://leetcode.com/problems/longest-turbulent-subarray/)
2-
3-
## 题目
4-
5-
A subarray `A[i], A[i+1], ..., A[j]` of `A` is said to be *turbulent* if and only if:
6-
7-
- For `i <= k < j``A[k] > A[k+1]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even;
8-
- **OR**, for `i <= k < j``A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is odd.
9-
10-
That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.
11-
12-
Return the **length** of a maximum size turbulent subarray of A.
13-
14-
**Example 1:**
15-
16-
Input: [9,4,2,10,7,8,8,1,9]
17-
Output: 5
18-
Explanation: (A[1] > A[2] < A[3] > A[4] < A[5])
19-
20-
**Example 2:**
21-
22-
Input: [4,8,12,16]
23-
Output: 2
24-
25-
**Example 3:**
26-
27-
Input: [100]
28-
Output: 1
29-
30-
**Note:**
31-
32-
1. `1 <= A.length <= 40000`
33-
2. `0 <= A[i] <= 10^9`
34-
35-
36-
## 题目大意
37-
38-
39-
当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:
40-
41-
若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1]
42-
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]
43-
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
44-
45-
返回 A 的最大湍流子数组的长度。
46-
47-
提示:
48-
49-
- 1 <= A.length <= 40000
50-
- 0 <= A[i] <= 10^9
51-
52-
53-
54-
## 解题思路
55-
56-
57-
- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。
58-
- 这一题可以用滑动窗口来解答。用一个变量记住下次出现的元素需要大于还是需要小于前一个元素。也可以用模拟的方法,用两个变量分别记录上升和下降数字的长度。一旦元素相等了,上升和下降数字长度都置为 1,其他时候按照上升和下降的关系增加队列长度即可,最后输出动态维护的最长长度
1+
# [978. Longest Turbulent Subarray](https://leetcode.com/problems/longest-turbulent-subarray/)
2+
3+
## 题目
4+
5+
A subarray `A[i], A[i+1], ..., A[j]` of `A` is said to be *turbulent* if and only if:
6+
7+
- For `i <= k < j``A[k] > A[k+1]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even;
8+
- **OR**, for `i <= k < j``A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is odd.
9+
10+
That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.
11+
12+
Return the **length** of a maximum size turbulent subarray of A.
13+
14+
**Example 1:**
15+
16+
Input: [9,4,2,10,7,8,8,1,9]
17+
Output: 5
18+
Explanation: (A[1] > A[2] < A[3] > A[4] < A[5])
19+
20+
**Example 2:**
21+
22+
Input: [4,8,12,16]
23+
Output: 2
24+
25+
**Example 3:**
26+
27+
Input: [100]
28+
Output: 1
29+
30+
**Note:**
31+
32+
1. `1 <= A.length <= 40000`
33+
2. `0 <= A[i] <= 10^9`
34+
35+
36+
## 题目大意
37+
38+
39+
当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组:
40+
41+
若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1]
42+
或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]
43+
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。
44+
45+
返回 A 的最大湍流子数组的长度。
46+
47+
提示:
48+
49+
- 1 <= A.length <= 40000
50+
- 0 <= A[i] <= 10^9
51+
52+
53+
54+
## 解题思路
55+
56+
57+
- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。
58+
- 这一题可以用滑动窗口来解答。用相邻元素差的乘积大于零(a ^ b >= 0 说明a b乘积大于零)来判断是否是湍流, 如果是,那么扩大窗口。否则窗口缩小为0,开始新的一个窗口

website/content/ChapterFour/0900~0999/0978.Longest-Turbulent-Subarray.md

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ Return the **length** of a maximum size turbulent subarray of A.
5555

5656

5757
- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。
58-
- 这一题可以用滑动窗口来解答。用一个变量记住下次出现的元素需要大于还是需要小于前一个元素。也可以用模拟的方法,用两个变量分别记录上升和下降数字的长度。一旦元素相等了,上升和下降数字长度都置为 1,其他时候按照上升和下降的关系增加队列长度即可,最后输出动态维护的最长长度。
59-
58+
- 这一题可以用滑动窗口来解答。用相邻元素差的乘积大于零(a ^ b >= 0 说明a b乘积大于零)来判断是否是湍流, 如果是,那么扩大窗口。否则窗口缩小为0,开始新的一个窗口。
6059

6160
## 代码
6261

@@ -65,14 +64,14 @@ Return the **length** of a maximum size turbulent subarray of A.
6564
package leetcode
6665

6766
// 解法一 模拟法
68-
func maxTurbulenceSize(A []int) int {
67+
func maxTurbulenceSize(arr []int) int {
6968
inc, dec := 1, 1
70-
maxLen := min(1, len(A))
71-
for i := 1; i < len(A); i++ {
72-
if A[i-1] < A[i] {
69+
maxLen := min(1, len(arr))
70+
for i := 1; i < len(arr); i++ {
71+
if arr[i-1] < arr[i] {
7372
inc = dec + 1
7473
dec = 1
75-
} else if A[i-1] > A[i] {
74+
} else if arr[i-1] > arr[i] {
7675
dec = inc + 1
7776
inc = 1
7877
} else {
@@ -85,25 +84,23 @@ func maxTurbulenceSize(A []int) int {
8584
}
8685

8786
// 解法二 滑动窗口
88-
func maxTurbulenceSize1(A []int) int {
89-
if len(A) == 1 {
90-
return 1
87+
func maxTurbulenceSize1(arr []int) int {
88+
var maxLength int
89+
if len(arr) == 2 && arr[0] != arr[1] {
90+
maxLength = 2
91+
} else {
92+
maxLength = 1
9193
}
92-
// flag > 0 代表下一个数要大于前一个数,flag < 0 代表下一个数要小于前一个数
93-
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0]
94-
for left < len(A) {
95-
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) {
96-
right++
97-
flag = lastNum - A[right]
98-
lastNum = A[right]
99-
} else {
100-
if flag != 0 {
101-
res = max(res, right-left+1)
102-
}
103-
left++
94+
left := 0
95+
for right := 2; right < len(arr); right++ {
96+
if arr[right] == arr[right-1] {
97+
left = right
98+
} else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
99+
left = right - 1
104100
}
101+
maxLength = max(maxLength, right-left+1)
105102
}
106-
return max(res, 1)
103+
return maxLength
107104
}
108105

109106
```

0 commit comments

Comments
 (0)