Skip to content

Commit aad7953

Browse files
committed
[E:57/533, M:56/974, H:6/387] add No: 376 Wiggle Subsequence
1 parent b0d2e44 commit aad7953

File tree

13 files changed

+514
-1
lines changed

13 files changed

+514
-1
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## [摆动序列](https://leetcode-cn.com/problems/wiggle-subsequence/)
2+
3+
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
4+
5+
例如, `[1,7,4,9,2,5]` 是一个摆动序列,因为差值 `(6,-3,5,-7,3)` 是正负交替出现的。相反, `[1,4,7,2,5]` 和 `[1,7,4,5,5]` 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
6+
7+
给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
8+
9+
**示例 1:**
10+
11+
`**输入:** [1,7,4,9,2,5]
12+
**输出:** 6
13+
**解释:** 整个序列均为摆动序列。
14+
`
15+
16+
**示例 2:**
17+
18+
`**输入:** [1,17,5,10,13,15,10,5,16,8]
19+
**输出:** 7
20+
**解释:** 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。`
21+
22+
**示例 3:**
23+
24+
`**输入:** [1,2,3,4,5,6,7,8,9]
25+
**输出:** 2`
26+
27+
**进阶:**
28+
29+
你能否用 O(_n_) 时间复杂度完成此题?
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/中等/376/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input []int
18+
want int
19+
}{
20+
{
21+
name: "test-[1,7,4,9,2,5]",
22+
input: []int{1, 7, 4, 9, 2, 5},
23+
want: 6,
24+
},
25+
{
26+
name: "test-[1,7]",
27+
input: []int{1, 7},
28+
want: 2,
29+
},
30+
{
31+
name: "test-[1]",
32+
input: []int{1},
33+
want: 1,
34+
},
35+
{
36+
name: "test-[]",
37+
input: []int{},
38+
want: 0,
39+
},
40+
{
41+
name: "test-[1,17,5,10,13,15,10,5,16,8]",
42+
input: []int{1, 17, 5, 10, 13, 15, 10, 5, 16, 8},
43+
want: 7,
44+
},
45+
{
46+
name: "test-[1,2,3,4,5,6,7,8,9]",
47+
input: []int{1, 2, 3, 4, 5, 6, 7, 8, 9},
48+
want: 2,
49+
},
50+
{
51+
name: "test-[5,5,5,5,5,5]",
52+
input: []int{5, 5, 5, 5, 5, 5},
53+
want: 1,
54+
},
55+
}
56+
57+
testLog := leet.NewTestLog(len(tests))
58+
defer testLog.Render()
59+
60+
timeoutDuration := time.Second * 2
61+
62+
for idx, test := range tests {
63+
// 超时检测
64+
got := test.want
65+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
66+
got = solution.Export(test.input)
67+
cancel()
68+
})
69+
70+
if timeout {
71+
testLog.Fail(idx+1, test.name, "timeout")
72+
continue
73+
}
74+
75+
if !reflect.DeepEqual(test.want, got) {
76+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
77+
continue
78+
}
79+
80+
testLog.Pass(idx+1, test.name)
81+
}
82+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return wiggleMaxLength(nums)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func wiggleMaxLength(nums []int) int {
29+
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return wiggleMaxLength(nums)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func wiggleMaxLength(nums []int) int {
29+
30+
}

questions/store.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## [摆动序列](https://leetcode-cn.com/problems/wiggle-subsequence/)
2+
3+
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
4+
5+
例如, `[1,7,4,9,2,5]` 是一个摆动序列,因为差值 `(6,-3,5,-7,3)` 是正负交替出现的。相反, `[1,4,7,2,5]` 和 `[1,7,4,5,5]` 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
6+
7+
给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
8+
9+
**示例 1:**
10+
11+
`**输入:** [1,7,4,9,2,5]
12+
**输出:** 6
13+
**解释:** 整个序列均为摆动序列。
14+
`
15+
16+
**示例 2:**
17+
18+
`**输入:** [1,17,5,10,13,15,10,5,16,8]
19+
**输出:** 7
20+
**解释:** 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。`
21+
22+
**示例 3:**
23+
24+
`**输入:** [1,2,3,4,5,6,7,8,9]
25+
**输出:** 2`
26+
27+
**进阶:**
28+
29+
你能否用 O(_n_) 时间复杂度完成此题?
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"reflect"
7+
"time"
8+
9+
"github.com/gladmo/leetcode/leet"
10+
"github.com/gladmo/leetcode/questions/serial/中等/376/golang/solution"
11+
)
12+
13+
func main() {
14+
15+
tests := []struct {
16+
name string
17+
input []int
18+
want int
19+
}{
20+
{
21+
name: "test-[1,7,4,9,2,5]",
22+
input: []int{1, 7, 4, 9, 2, 5},
23+
want: 6,
24+
},
25+
{
26+
name: "test-[1,7]",
27+
input: []int{1, 7},
28+
want: 2,
29+
},
30+
{
31+
name: "test-[1]",
32+
input: []int{1},
33+
want: 1,
34+
},
35+
{
36+
name: "test-[]",
37+
input: []int{},
38+
want: 0,
39+
},
40+
{
41+
name: "test-[1,17,5,10,13,15,10,5,16,8]",
42+
input: []int{1, 17, 5, 10, 13, 15, 10, 5, 16, 8},
43+
want: 7,
44+
},
45+
{
46+
name: "test-[1,2,3,4,5,6,7,8,9]",
47+
input: []int{1, 2, 3, 4, 5, 6, 7, 8, 9},
48+
want: 2,
49+
},
50+
{
51+
name: "test-[5,5,5,5,5,5]",
52+
input: []int{5, 5, 5, 5, 5, 5},
53+
want: 1,
54+
},
55+
}
56+
57+
testLog := leet.NewTestLog(len(tests))
58+
defer testLog.Render()
59+
60+
timeoutDuration := time.Second * 2
61+
62+
for idx, test := range tests {
63+
// 超时检测
64+
got := test.want
65+
timeout := leet.Timeout(timeoutDuration, func(ctx context.Context, cancel context.CancelFunc) {
66+
got = solution.Export(test.input)
67+
cancel()
68+
})
69+
70+
if timeout {
71+
testLog.Fail(idx+1, test.name, "timeout")
72+
continue
73+
}
74+
75+
if !reflect.DeepEqual(test.want, got) {
76+
testLog.Fail(idx+1, test.name, fmt.Sprintf("want: %v, got %v.", test.want, got))
77+
continue
78+
}
79+
80+
testLog.Pass(idx+1, test.name)
81+
}
82+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return wiggleMaxLength(nums)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func wiggleMaxLength(nums []int) int {
29+
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package solution
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"runtime/debug"
7+
)
8+
9+
func Export(nums []int) int {
10+
defer func() {
11+
if r := recover(); r != nil {
12+
fmt.Println("Params: ", nums)
13+
fmt.Println("Panic:", r)
14+
fmt.Println()
15+
debug.PrintStack()
16+
os.Exit(0)
17+
}
18+
}()
19+
20+
return wiggleMaxLength(nums)
21+
}
22+
23+
/****************************************************/
24+
/******** 以下为 Leetcode 示例部分(提交PR请还原) *******/
25+
/******** 使用 (./leetcode clear) 初始化所有问题 *******/
26+
/****************************************************/
27+
28+
func wiggleMaxLength(nums []int) int {
29+
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## [摆动序列](https://leetcode-cn.com/problems/wiggle-subsequence/)
2+
3+
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为**摆动序列。**第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。
4+
5+
例如, `[1,7,4,9,2,5]` 是一个摆动序列,因为差值 `(6,-3,5,-7,3)` 是正负交替出现的。相反, `[1,4,7,2,5]` 和 `[1,7,4,5,5]` 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。
6+
7+
给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。
8+
9+
**示例 1:**
10+
11+
`**输入:** [1,7,4,9,2,5]
12+
**输出:** 6
13+
**解释:** 整个序列均为摆动序列。
14+
`
15+
16+
**示例 2:**
17+
18+
`**输入:** [1,17,5,10,13,15,10,5,16,8]
19+
**输出:** 7
20+
**解释:** 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。`
21+
22+
**示例 3:**
23+
24+
`**输入:** [1,2,3,4,5,6,7,8,9]
25+
**输出:** 2`
26+
27+
**进阶:**
28+
29+
你能否用 O(_n_) 时间复杂度完成此题?

0 commit comments

Comments
 (0)