fix 0978: update a clearer solution

This commit is contained in:
novahe
2021-11-24 10:08:39 +08:00
parent f0792d1179
commit 9cc8c478b9
3 changed files with 97 additions and 102 deletions

View File

@ -1,14 +1,14 @@
package leetcode package leetcode
// 解法一 模拟法 // 解法一 模拟法
func maxTurbulenceSize(A []int) int { func maxTurbulenceSize(arr []int) int {
inc, dec := 1, 1 inc, dec := 1, 1
maxLen := min(1, len(A)) maxLen := min(1, len(arr))
for i := 1; i < len(A); i++ { for i := 1; i < len(arr); i++ {
if A[i-1] < A[i] { if arr[i-1] < arr[i] {
inc = dec + 1 inc = dec + 1
dec = 1 dec = 1
} else if A[i-1] > A[i] { } else if arr[i-1] > arr[i] {
dec = inc + 1 dec = inc + 1
inc = 1 inc = 1
} else { } else {
@ -35,23 +35,21 @@ func min(a int, b int) int {
} }
// 解法二 滑动窗口 // 解法二 滑动窗口
func maxTurbulenceSize1(A []int) int { func maxTurbulenceSize1(arr []int) int {
if len(A) == 1 { var maxLength int
return 1 if len(arr) == 2 && arr[0] != arr[1] {
maxLength = 2
} else {
maxLength = 1
} }
// flag > 0 代表下一个数要大于前一个数flag < 0 代表下一个数要小于前一个数 left := 0
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0] for right := 2; right < len(arr); right++ {
for left < len(A) { if arr[right] == arr[right-1] {
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) { left = right
right++ } else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
flag = lastNum - A[right] left = right - 1
lastNum = A[right]
} else {
if flag != 0 {
res = max(res, right-left+1)
}
left++
} }
maxLength = max(maxLength, right-left+1)
} }
return max(res, 1) return maxLength
} }

View File

@ -1,58 +1,58 @@
# [978. Longest Turbulent Subarray](https://leetcode.com/problems/longest-turbulent-subarray/) # [978. Longest Turbulent Subarray](https://leetcode.com/problems/longest-turbulent-subarray/)
## 题目 ## 题目
A subarray `A[i], A[i+1], ..., A[j]` of `A` is said to be *turbulent* if and only if: A subarray `A[i], A[i+1], ..., A[j]` of `A` is said to be *turbulent* if and only if:
- For `i <= k < j`, `A[k] > A[k+1]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even; - For `i <= k < j`, `A[k] > A[k+1]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even;
- **OR**, for `i <= k < j`, `A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is odd. - **OR**, for `i <= k < j`, `A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is odd.
That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray. That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.
Return the **length** of a maximum size turbulent subarray of A. Return the **length** of a maximum size turbulent subarray of A.
**Example 1:** **Example 1:**
Input: [9,4,2,10,7,8,8,1,9] Input: [9,4,2,10,7,8,8,1,9]
Output: 5 Output: 5
Explanation: (A[1] > A[2] < A[3] > A[4] < A[5]) Explanation: (A[1] > A[2] < A[3] > A[4] < A[5])
**Example 2:** **Example 2:**
Input: [4,8,12,16] Input: [4,8,12,16]
Output: 2 Output: 2
**Example 3:** **Example 3:**
Input: [100] Input: [100]
Output: 1 Output: 1
**Note:** **Note:**
1. `1 <= A.length <= 40000` 1. `1 <= A.length <= 40000`
2. `0 <= A[i] <= 10^9` 2. `0 <= A[i] <= 10^9`
## 题目大意 ## 题目大意
A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时我们称其为湍流子数组 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时我们称其为湍流子数组
 i <= k < j k 为奇数时 A[k] > A[k+1],且当 k 为偶数时A[k] < A[k+1]  i <= k < j k 为奇数时 A[k] > A[k+1],且当 k 为偶数时A[k] < A[k+1]
 i <= k < j k 为偶数时A[k] > A[k+1] ,且当 k 为奇数时 A[k] < A[k+1]。  i <= k < j k 为偶数时A[k] > A[k+1] ,且当 k 为奇数时 A[k] < A[k+1]。
也就是说如果比较符号在子数组中的每个相邻元素对之间翻转则该子数组是湍流子数组 也就是说如果比较符号在子数组中的每个相邻元素对之间翻转则该子数组是湍流子数组
返回 A 的最大湍流子数组的长度 返回 A 的最大湍流子数组的长度
提示 提示
- 1 <= A.length <= 40000 - 1 <= A.length <= 40000
- 0 <= A[i] <= 10^9 - 0 <= A[i] <= 10^9
## 解题思路 ## 解题思路
- 给出一个数组要求找出摆动数组的最大长度所谓摆动数组的意思是元素一大一小间隔的 - 给出一个数组要求找出摆动数组的最大长度所谓摆动数组的意思是元素一大一小间隔的
- 这一题可以用滑动窗口来解答一个变量记住下次出现的元素需要大于还是需要小于前一个元素也可以用模拟的方法用两个变量分别记录上升和下降数字的长度一旦元素相等了上升和下降数字长度都置为 1其他时候按照上升和下降的关系增加队列长度即可最后输出动态维护的最长长度 - 这一题可以用滑动窗口来解答相邻元素差的乘积大于零a ^ b >= 0 说明a b乘积大于零来判断是否是湍流 如果是那么扩大窗口。否则窗口缩小为0开始新的一个窗口。

View File

@ -55,8 +55,7 @@ Return the **length** of a maximum size turbulent subarray of A.
- 给出一个数组要求找出摆动数组的最大长度所谓摆动数组的意思是元素一大一小间隔的 - 给出一个数组要求找出摆动数组的最大长度所谓摆动数组的意思是元素一大一小间隔的
- 这一题可以用滑动窗口来解答一个变量记住下次出现的元素需要大于还是需要小于前一个元素也可以用模拟的方法用两个变量分别记录上升和下降数字的长度一旦元素相等了上升和下降数字长度都置为 1其他时候按照上升和下降的关系增加队列长度即可最后输出动态维护的最长长度 - 这一题可以用滑动窗口来解答相邻元素差的乘积大于零a ^ b >= 0 说明a b乘积大于零来判断是否是湍流 如果是那么扩大窗口。否则窗口缩小为0开始新的一个窗口。
## 代码 ## 代码
@ -65,14 +64,14 @@ Return the **length** of a maximum size turbulent subarray of A.
package leetcode package leetcode
// 解法一 模拟法 // 解法一 模拟法
func maxTurbulenceSize(A []int) int { func maxTurbulenceSize(arr []int) int {
inc, dec := 1, 1 inc, dec := 1, 1
maxLen := min(1, len(A)) maxLen := min(1, len(arr))
for i := 1; i < len(A); i++ { for i := 1; i < len(arr); i++ {
if A[i-1] < A[i] { if arr[i-1] < arr[i] {
inc = dec + 1 inc = dec + 1
dec = 1 dec = 1
} else if A[i-1] > A[i] { } else if arr[i-1] > arr[i] {
dec = inc + 1 dec = inc + 1
inc = 1 inc = 1
} else { } else {
@ -85,25 +84,23 @@ func maxTurbulenceSize(A []int) int {
} }
// 解法二 滑动窗口 // 解法二 滑动窗口
func maxTurbulenceSize1(A []int) int { func maxTurbulenceSize1(arr []int) int {
if len(A) == 1 { var maxLength int
return 1 if len(arr) == 2 && arr[0] != arr[1] {
maxLength = 2
} else {
maxLength = 1
} }
// flag > 0 代表下一个数要大于前一个数flag < 0 代表下一个数要小于前一个数 left := 0
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0] for right := 2; right < len(arr); right++ {
for left < len(A) { if arr[right] == arr[right-1] {
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) { left = right
right++ } else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
flag = lastNum - A[right] left = right - 1
lastNum = A[right]
} else {
if flag != 0 {
res = max(res, right-left+1)
}
left++
} }
maxLength = max(maxLength, right-left+1)
} }
return max(res, 1) return maxLength
} }
``` ```