mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-07 01:44:56 +08:00
Merge pull request #196 from novahe/master
fix 0978: update a clearer solution
This commit is contained in:
@ -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
|
||||||
// flag > 0 代表下一个数要大于前一个数,flag < 0 代表下一个数要小于前一个数
|
|
||||||
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0]
|
|
||||||
for left < len(A) {
|
|
||||||
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) {
|
|
||||||
right++
|
|
||||||
flag = lastNum - A[right]
|
|
||||||
lastNum = A[right]
|
|
||||||
} else {
|
} else {
|
||||||
if flag != 0 {
|
maxLength = 1
|
||||||
res = max(res, right-left+1)
|
|
||||||
}
|
}
|
||||||
left++
|
left := 0
|
||||||
|
for right := 2; right < len(arr); right++ {
|
||||||
|
if arr[right] == arr[right-1] {
|
||||||
|
left = right
|
||||||
|
} else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
|
||||||
|
left = right - 1
|
||||||
}
|
}
|
||||||
|
maxLength = max(maxLength, right-left+1)
|
||||||
}
|
}
|
||||||
return max(res, 1)
|
return maxLength
|
||||||
}
|
}
|
||||||
|
@ -55,4 +55,4 @@ Return the **length** of a maximum size turbulent subarray of A.
|
|||||||
|
|
||||||
|
|
||||||
- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。
|
- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。
|
||||||
- 这一题可以用滑动窗口来解答。用一个变量记住下次出现的元素需要大于还是需要小于前一个元素。也可以用模拟的方法,用两个变量分别记录上升和下降数字的长度。一旦元素相等了,上升和下降数字长度都置为 1,其他时候按照上升和下降的关系增加队列长度即可,最后输出动态维护的最长长度。
|
- 这一题可以用滑动窗口来解答。用相邻元素差的乘积大于零(a ^ b >= 0 说明a b乘积大于零)来判断是否是湍流, 如果是,那么扩大窗口。否则窗口缩小为0,开始新的一个窗口。
|
@ -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
|
||||||
// flag > 0 代表下一个数要大于前一个数,flag < 0 代表下一个数要小于前一个数
|
|
||||||
res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0]
|
|
||||||
for left < len(A) {
|
|
||||||
if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) {
|
|
||||||
right++
|
|
||||||
flag = lastNum - A[right]
|
|
||||||
lastNum = A[right]
|
|
||||||
} else {
|
} else {
|
||||||
if flag != 0 {
|
maxLength = 1
|
||||||
res = max(res, right-left+1)
|
|
||||||
}
|
}
|
||||||
left++
|
left := 0
|
||||||
|
for right := 2; right < len(arr); right++ {
|
||||||
|
if arr[right] == arr[right-1] {
|
||||||
|
left = right
|
||||||
|
} else if (arr[right]-arr[right-1])^(arr[right-1]-arr[right-2]) >= 0 {
|
||||||
|
left = right - 1
|
||||||
}
|
}
|
||||||
|
maxLength = max(maxLength, right-left+1)
|
||||||
}
|
}
|
||||||
return max(res, 1)
|
return maxLength
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
Reference in New Issue
Block a user