Skip to content

Commit 77da2cb

Browse files
authored
Merge pull request 6boris#48 from kylesliu/develop
add 376 problem solution
2 parents e83d2fb + 1ee082d commit 77da2cb

File tree

4 files changed

+174
-0
lines changed

4 files changed

+174
-0
lines changed
1.94 MB
Loading
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# [376. Wiggle Subsequence][title]
2+
3+
## Description
4+
5+
A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than two elements is trivially a wiggle sequence.
6+
7+
For example, [1,7,4,9,2,5] is a wiggle sequence because the differences (6,-3,5,-7,3) are alternately positive and negative. In contrast, [1,4,7,2,5] and [1,7,4,5,5] are not wiggle sequences, the first because its first two differences are positive and the second because its last difference is zero.
8+
9+
Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence. A subsequence is obtained by deleting some number of elements (eventually, also zero) from the original sequence, leaving the remaining elements in their original order.
10+
11+
**Example 1:**
12+
13+
```
14+
Input: [1,7,4,9,2,5]
15+
Output: 6
16+
Explanation: The entire sequence is a wiggle sequence.
17+
```
18+
19+
**Example 2:**
20+
21+
```
22+
Input: [1,17,5,10,13,15,10,5,16,8]
23+
Output: 7
24+
Explanation: There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
25+
```
26+
27+
**Example 3:**
28+
29+
```
30+
Input: [1,2,3,4,5,6,7,8,9]
31+
Output: 2
32+
```
33+
34+
**Tags:** Math, String
35+
36+
## 题意
37+
>求摇摆序列最长序列,可以转化为数组【上升】【下降】状态的转换
38+
39+
<a href="https://github.com/kylesliu/awesome-golang-leetcode/tree/master/assets/images/376_Wiggle_Subsequence.jpg">
40+
<img src="https://github.com/kylesliu/awesome-golang-leetcode/tree/master/assets/images/376_Wiggle_Subsequence.jpg" />
41+
</a>
42+
43+
## 题解
44+
45+
### 思路1
46+
> 按照小学算数那么来做,用 `carry` 表示进位,从后往前算,依次往前,每算出一位就插入到最前面即可,直到把两个二进制串都遍历完即可。
47+
48+
```go
49+
func wiggleMaxLength(nums []int) int {
50+
// 序列个数小于二直接是摇摆序列
51+
if len(nums) < 2 {
52+
return len(nums)
53+
}
54+
// 3种状态
55+
const BEGIN, UP, DOWN = 0, 1, 2
56+
// 摇摆序列最小长度至少为1
57+
STATE, maxLength := BEGIN, 1
58+
59+
for i := 1; i < len(nums); i++ {
60+
switch STATE {
61+
case BEGIN:
62+
if nums[i-1] < nums[i] {
63+
STATE = UP
64+
maxLength++
65+
} else if nums[i-1] > nums[i] {
66+
STATE = DOWN
67+
maxLength++
68+
}
69+
case UP:
70+
if nums[i-1] > nums[i] {
71+
STATE = DOWN
72+
maxLength++
73+
}
74+
case DOWN:
75+
if nums[i-1] < nums[i] {
76+
STATE = UP
77+
maxLength++
78+
}
79+
}
80+
}
81+
return maxLength
82+
}
83+
84+
```
85+
86+
### 思路2
87+
> 思路2
88+
```go
89+
90+
```
91+
92+
## 结语
93+
94+
如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-golang-leetcode][me]
95+
96+
[title]: https://leetcode.com/problems/wiggle-subsequence/
97+
[me]: https://github.com/kylesliu/awesome-golang-leetcode
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package Solution
2+
3+
func wiggleMaxLength(nums []int) int {
4+
// 序列个数小于二直接是摇摆序列
5+
if len(nums) < 2 {
6+
return len(nums)
7+
}
8+
// 3种状态
9+
const BEGIN, UP, DOWN = 0, 1, 2
10+
// 摇摆序列最小长度至少为1
11+
STATE, maxLength := BEGIN, 1
12+
13+
for i := 1; i < len(nums); i++ {
14+
switch STATE {
15+
case BEGIN:
16+
if nums[i-1] < nums[i] {
17+
STATE = UP
18+
maxLength++
19+
} else if nums[i-1] > nums[i] {
20+
STATE = DOWN
21+
maxLength++
22+
}
23+
case UP:
24+
if nums[i-1] > nums[i] {
25+
STATE = DOWN
26+
maxLength++
27+
}
28+
case DOWN:
29+
if nums[i-1] < nums[i] {
30+
STATE = UP
31+
maxLength++
32+
}
33+
}
34+
}
35+
return maxLength
36+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package Solution
2+
3+
import (
4+
"reflect"
5+
"strconv"
6+
"testing"
7+
)
8+
9+
func TestSolution(t *testing.T) {
10+
// 测试用例
11+
cases := []struct {
12+
name string
13+
inputs []int
14+
expect int
15+
}{
16+
{"TestCase", []int{1, 7, 4, 9, 2, 5}, 6},
17+
{"TestCase", []int{1, 17, 5, 10, 13, 15, 10, 5, 16, 8}, 7},
18+
{"TestCase", []int{1, 2, 3, 4, 5, 6, 7, 8, 9}, 2},
19+
}
20+
21+
// 开始测试
22+
for i, c := range cases {
23+
t.Run(c.name+strconv.Itoa(i), func(t *testing.T) {
24+
got := wiggleMaxLength(c.inputs)
25+
if !reflect.DeepEqual(got, c.expect) {
26+
t.Fatalf("expected: %v, but got: %v, with inputs: %v",
27+
c.expect, got, c.inputs)
28+
}
29+
})
30+
}
31+
}
32+
33+
// 压力测试
34+
func BenchmarkSolution(b *testing.B) {
35+
36+
}
37+
38+
// 使用案列
39+
func ExampleSolution() {
40+
41+
}

0 commit comments

Comments
 (0)