-
Notifications
You must be signed in to change notification settings - Fork 2.4k
/
Copy path0978-longest-turbulent-subarray.js
75 lines (57 loc) · 1.61 KB
/
0978-longest-turbulent-subarray.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* Two Pointers | Greedy
* Time O(n) | Space O(1)
* https://leetcode.com/problems/longest-turbulent-subarray/
* @param {number[]} arr
* @return {number}
*/
var maxTurbulenceSize = function(arr) {
const higherAndLower = (start) => {
let i = start;
let shouldBeLow = true;
while (i + 1 < arr.length) {
if (shouldBeLow && arr[i + 1] > arr[i]) break;
if (!shouldBeLow && arr[i + 1] < arr[i]) break;
if (arr[i + 1] === arr[i]) break;
shouldBeLow = !shouldBeLow;
i++;
}
return i;
}
const lowerAndHigher = (start) => {
let i = start;
let shouldBeHigh = true;
while (i + 1 < arr.length) {
if (shouldBeHigh && arr[i + 1] < arr[i]) break;
if (!shouldBeHigh && arr[i + 1] > arr[i]) break;
if (arr[i + 1] === arr[i]) break;
shouldBeHigh = !shouldBeHigh;
i++;
}
return i;
}
let left = 0;
let right = 1;
let max = 1;
while (right < arr.length) {
if (arr[left] > arr[right]) {
right = higherAndLower(left);
max = Math.max(right - left + 1, max);
left = right;
right = right + 1;
continue;
}
if (arr[left] < arr[right]) {
right = lowerAndHigher(left);
max = Math.max(right - left + 1, max);
left = right;
right = right + 1;
continue;
}
if (arr[left] === arr[right]) {
left++;
right++;
}
}
return max;
};