Skip to content

Commit a77041c

Browse files
committed
feat: add solutions to lc problem: No.0978
No.0978.Longest Turbulent Subarray
1 parent 60ad101 commit a77041c

File tree

7 files changed

+248
-20
lines changed

7 files changed

+248
-20
lines changed

solution/0900-0999/0978.Longest Turbulent Subarray/README.md

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,116 @@
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66+
**方法一:动态规划**
67+
68+
我们定义 $f[i]$ 表示以 $nums[i]$ 结尾且结尾处于上升状态的最长湍流子数组的长度,定义 $g[i]$ 表示以 $nums[i]$ 结尾且结尾处于下降状态的最长湍流子数组的长度。初始时 $f[0] = 1$, $g[0] = 1$。答案为 $max(f[i], g[i])$。
69+
70+
对于 $i \gt 0$,若 $nums[i] \gt nums[i - 1]$,则 $f[i] = g[i - 1] + 1$,否则 $f[i] = 1$;若 $nums[i] \lt nums[i - 1]$,则 $g[i] = f[i - 1] + 1$,否则 $g[i] = 1$。
71+
72+
由于 $f[i]$ 和 $g[i]$ 只与 $f[i - 1]$ 和 $g[i - 1]$ 有关,因此可以使用两个变量代替数组。
73+
74+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度。
75+
6676
<!-- tabs:start -->
6777

6878
### **Python3**
6979

7080
<!-- 这里可写当前语言的特殊实现逻辑 -->
7181

7282
```python
73-
83+
class Solution:
84+
def maxTurbulenceSize(self, arr: List[int]) -> int:
85+
ans = f = g = 1
86+
for a, b in pairwise(arr):
87+
ff = g + 1 if a < b else 1
88+
gg = f + 1 if a > b else 1
89+
f, g = ff, gg
90+
ans = max(ans, f, g)
91+
return ans
7492
```
7593

7694
### **Java**
7795

7896
<!-- 这里可写当前语言的特殊实现逻辑 -->
7997

8098
```java
99+
class Solution {
100+
public int maxTurbulenceSize(int[] arr) {
101+
int ans = 1, f = 1, g = 1;
102+
for (int i = 1; i < arr.length; ++i) {
103+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
104+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
105+
f = ff;
106+
g = gg;
107+
ans = Math.max(ans, Math.max(f, g));
108+
}
109+
return ans;
110+
}
111+
}
112+
```
113+
114+
### **C++**
115+
116+
```cpp
117+
class Solution {
118+
public:
119+
int maxTurbulenceSize(vector<int>& arr) {
120+
int ans = 1, f = 1, g = 1;
121+
for (int i = 1; i < arr.size(); ++i) {
122+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
123+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
124+
f = ff;
125+
g = gg;
126+
ans = max({ans, f, g});
127+
}
128+
return ans;
129+
}
130+
};
131+
```
132+
133+
### **Go**
134+
135+
```go
136+
func maxTurbulenceSize(arr []int) int {
137+
ans, f, g := 1, 1, 1
138+
for i, x := range arr[1:] {
139+
ff, gg := 1, 1
140+
if arr[i] < x {
141+
ff = g + 1
142+
}
143+
if arr[i] > x {
144+
gg = f + 1
145+
}
146+
f, g = ff, gg
147+
ans = max(ans, max(f, g))
148+
}
149+
return ans
150+
}
151+
152+
func max(a, b int) int {
153+
if a > b {
154+
return a
155+
}
156+
return b
157+
}
158+
```
81159

160+
### **TypeScript**
161+
162+
```ts
163+
function maxTurbulenceSize(arr: number[]): number {
164+
let f = 1;
165+
let g = 1;
166+
let ans = 1;
167+
for (let i = 1; i < arr.length; ++i) {
168+
const ff = arr[i - 1] < arr[i] ? g + 1 : 1;
169+
const gg = arr[i - 1] > arr[i] ? f + 1 : 1;
170+
f = ff;
171+
g = gg;
172+
ans = Math.max(ans, f, g);
173+
}
174+
return ans;
175+
}
82176
```
83177

84178
### **...**

solution/0900-0999/0978.Longest Turbulent Subarray/README_EN.md

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,97 @@
6363
### **Python3**
6464

6565
```python
66-
66+
class Solution:
67+
def maxTurbulenceSize(self, arr: List[int]) -> int:
68+
ans = f = g = 1
69+
for a, b in pairwise(arr):
70+
ff = g + 1 if a < b else 1
71+
gg = f + 1 if a > b else 1
72+
f, g = ff, gg
73+
ans = max(ans, f, g)
74+
return ans
6775
```
6876

6977
### **Java**
7078

7179
```java
80+
class Solution {
81+
public int maxTurbulenceSize(int[] arr) {
82+
int ans = 1, f = 1, g = 1;
83+
for (int i = 1; i < arr.length; ++i) {
84+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
85+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
86+
f = ff;
87+
g = gg;
88+
ans = Math.max(ans, Math.max(f, g));
89+
}
90+
return ans;
91+
}
92+
}
93+
```
94+
95+
### **C++**
96+
97+
```cpp
98+
class Solution {
99+
public:
100+
int maxTurbulenceSize(vector<int>& arr) {
101+
int ans = 1, f = 1, g = 1;
102+
for (int i = 1; i < arr.size(); ++i) {
103+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
104+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
105+
f = ff;
106+
g = gg;
107+
ans = max({ans, f, g});
108+
}
109+
return ans;
110+
}
111+
};
112+
```
113+
114+
### **Go**
115+
116+
```go
117+
func maxTurbulenceSize(arr []int) int {
118+
ans, f, g := 1, 1, 1
119+
for i, x := range arr[1:] {
120+
ff, gg := 1, 1
121+
if arr[i] < x {
122+
ff = g + 1
123+
}
124+
if arr[i] > x {
125+
gg = f + 1
126+
}
127+
f, g = ff, gg
128+
ans = max(ans, max(f, g))
129+
}
130+
return ans
131+
}
132+
133+
func max(a, b int) int {
134+
if a > b {
135+
return a
136+
}
137+
return b
138+
}
139+
```
72140

141+
### **TypeScript**
142+
143+
```ts
144+
function maxTurbulenceSize(arr: number[]): number {
145+
let f = 1;
146+
let g = 1;
147+
let ans = 1;
148+
for (let i = 1; i < arr.length; ++i) {
149+
const ff = arr[i - 1] < arr[i] ? g + 1 : 1;
150+
const gg = arr[i - 1] > arr[i] ? f + 1 : 1;
151+
f = ff;
152+
g = gg;
153+
ans = Math.max(ans, f, g);
154+
}
155+
return ans;
156+
}
73157
```
74158

75159
### **...**
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
int maxTurbulenceSize(vector<int>& arr) {
4+
int ans = 1, f = 1, g = 1;
5+
for (int i = 1; i < arr.size(); ++i) {
6+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
7+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
8+
f = ff;
9+
g = gg;
10+
ans = max({ans, f, g});
11+
}
12+
return ans;
13+
}
14+
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
func maxTurbulenceSize(arr []int) int {
2+
ans, f, g := 1, 1, 1
3+
for i, x := range arr[1:] {
4+
ff, gg := 1, 1
5+
if arr[i] < x {
6+
ff = g + 1
7+
}
8+
if arr[i] > x {
9+
gg = f + 1
10+
}
11+
f, g = ff, gg
12+
ans = max(ans, max(f, g))
13+
}
14+
return ans
15+
}
16+
17+
func max(a, b int) int {
18+
if a > b {
19+
return a
20+
}
21+
return b
22+
}
Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
11
class Solution {
2-
public int maxTurbulenceSize(int[] A) {
3-
int res = 1;
4-
int up = 1, down = 1;
5-
for (int i = 1; i < A.length; ++i) {
6-
if (A[i] > A[i - 1]) {
7-
up = down + 1;
8-
down = 1;
9-
res = Math.max(res, up);
10-
} else if (A[i] < A[i - 1]) {
11-
down = up + 1;
12-
up = 1;
13-
res = Math.max(res, down);
14-
} else {
15-
up = 1;
16-
down = 1;
17-
}
2+
public int maxTurbulenceSize(int[] arr) {
3+
int ans = 1, f = 1, g = 1;
4+
for (int i = 1; i < arr.length; ++i) {
5+
int ff = arr[i - 1] < arr[i] ? g + 1 : 1;
6+
int gg = arr[i - 1] > arr[i] ? f + 1 : 1;
7+
f = ff;
8+
g = gg;
9+
ans = Math.max(ans, Math.max(f, g));
1810
}
19-
return res;
11+
return ans;
2012
}
21-
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def maxTurbulenceSize(self, arr: List[int]) -> int:
3+
ans = f = g = 1
4+
for a, b in pairwise(arr):
5+
ff = g + 1 if a < b else 1
6+
gg = f + 1 if a > b else 1
7+
f, g = ff, gg
8+
ans = max(ans, f, g)
9+
return ans
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function maxTurbulenceSize(arr: number[]): number {
2+
let f = 1;
3+
let g = 1;
4+
let ans = 1;
5+
for (let i = 1; i < arr.length; ++i) {
6+
const ff = arr[i - 1] < arr[i] ? g + 1 : 1;
7+
const gg = arr[i - 1] > arr[i] ? f + 1 : 1;
8+
f = ff;
9+
g = gg;
10+
ans = Math.max(ans, f, g);
11+
}
12+
return ans;
13+
}

0 commit comments

Comments
 (0)