Skip to content

Commit 6ef490e

Browse files
committedJul 22, 2021
feat: add solutions to lc problem: No.0376. Wiggle Subsequence
1 parent 1ececd1 commit 6ef490e

File tree

8 files changed

+186
-12
lines changed

8 files changed

+186
-12
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@
195195
- [最长回文子串](./solution/0000-0099/0005.Longest%20Palindromic%20Substring/README.md)
196196
- [最长回文子序列](.solution/0500-0599/0516.Longest%20Palindromic%20Subsequence/README.md)
197197
- [最长递增子序列](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README.md)
198+
- [摆动序列](./solution/0300-0399/0376.Wiggle%20Subsequence/README.md)
198199
- [礼物的最大价值](./lcof/面试题47.%20礼物的最大价值/README.md)
199200
- [俄罗斯套娃信封问题](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README.md)
200201
- [最长公共子序列](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README.md)

‎README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
189189
- [Longest Palindromic Substring](./solution/0000-0099/0005.Longest%20Palindromic%20Substring/README_EN.md)
190190
- [Longest Palindromic Subsequence](.solution/0500-0599/0516.Longest%20Palindromic%20Subsequence/README_EN.md)
191191
- [Longest Increasing Subsequence](./solution/0300-0399/0300.Longest%20Increasing%20Subsequence/README_EN.md)
192+
- [Wiggle Subsequence](./solution/0300-0399/0376.Wiggle%20Subsequence/README_EN.md)
192193
- [Russian Doll Envelopes](./solution/0300-0399/0354.Russian%20Doll%20Envelopes/README_EN.md)
193194
- [Longest Common Subsequence](./solution/1100-1199/1143.Longest%20Common%20Subsequence/README_EN.md)
194195

‎solution/0300-0399/0376.Wiggle Subsequence/README.md

+74-2
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,99 @@
3333
<p><strong>进阶:</strong><br>
3434
你能否用&nbsp;O(<em>n</em>) 时间复杂度完成此题?</p>
3535

36-
3736
## 解法
3837

3938
<!-- 这里可写通用的实现逻辑 -->
4039

40+
动态规划。
41+
42+
设 up 表示以前 i 个元素中的某一个元素结尾的最长上升摆动序列的长度,down 表示以前 i 个元素中的某一个元素结尾的最长下降摆动序列的长度。初始 `up = 1`, `down = 1`
43+
44+
从数组下标 1 开始遍历:
45+
46+
-`nums[i] > nums[i - 1]`,则需要更新最长上升摆动序列的长度:`up = max(up, down + 1)`
47+
-`nums[i] < nums[i - 1]`,则需要更新最长下降摆动序列的长度:`down = max(down, up + 1)`
48+
49+
最后返回 `max(up, down)` 即可。
50+
4151
<!-- tabs:start -->
4252

4353
### **Python3**
4454

4555
<!-- 这里可写当前语言的特殊实现逻辑 -->
4656

4757
```python
48-
58+
class Solution:
59+
def wiggleMaxLength(self, nums: List[int]) -> int:
60+
up = down = 1
61+
for i in range(1, len(nums)):
62+
if nums[i] > nums[i - 1]:
63+
up = max(up, down + 1)
64+
elif nums[i] < nums[i - 1]:
65+
down = max(down, up + 1)
66+
return max(up, down)
4967
```
5068

5169
### **Java**
5270

5371
<!-- 这里可写当前语言的特殊实现逻辑 -->
5472

5573
```java
74+
class Solution {
75+
public int wiggleMaxLength(int[] nums) {
76+
int up = 1, down = 1;
77+
for (int i = 1; i < nums.length; ++i) {
78+
if (nums[i] > nums[i - 1]) {
79+
up = Math.max(up, down + 1);
80+
} else if (nums[i] < nums[i - 1]) {
81+
down = Math.max(down, up + 1);
82+
}
83+
}
84+
return Math.max(up, down);
85+
}
86+
}
87+
```
88+
89+
### **C++**
90+
91+
```cpp
92+
class Solution {
93+
public:
94+
int wiggleMaxLength(vector<int>& nums) {
95+
int up = 1, down = 1;
96+
for (int i = 1; i < nums.size(); ++i) {
97+
if (nums[i] > nums[i - 1]) {
98+
up = max(up, down + 1);
99+
} else if (nums[i] < nums[i - 1]) {
100+
down = max(down, up + 1);
101+
}
102+
}
103+
return max(up, down);
104+
}
105+
};
106+
```
56107
108+
### **Go**
109+
110+
```go
111+
func wiggleMaxLength(nums []int) int {
112+
up, down := 1, 1
113+
for i := 1; i < len(nums); i++ {
114+
if nums[i] > nums[i-1] {
115+
up = max(up, down+1)
116+
} else if nums[i] < nums[i-1] {
117+
down = max(down, up+1)
118+
}
119+
}
120+
return max(up, down)
121+
}
122+
123+
func max(a, b int) int {
124+
if a > b {
125+
return a
126+
}
127+
return b
128+
}
57129
```
58130

59131
### **...**

‎solution/0300-0399/0376.Wiggle Subsequence/README_EN.md

+65-2
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,84 @@ One is [1, 17, 10, 13, 10, 16, 8] with differences (16, -7, 3, -3, 6, -8).
5151
<p>&nbsp;</p>
5252
<p><strong>Follow up:</strong> Could you solve this in <code>O(n)</code> time?</p>
5353

54-
5554
## Solutions
5655

56+
Dynamic programming.
57+
5758
<!-- tabs:start -->
5859

5960
### **Python3**
6061

6162
```python
62-
63+
class Solution:
64+
def wiggleMaxLength(self, nums: List[int]) -> int:
65+
up = down = 1
66+
for i in range(1, len(nums)):
67+
if nums[i] > nums[i - 1]:
68+
up = max(up, down + 1)
69+
elif nums[i] < nums[i - 1]:
70+
down = max(down, up + 1)
71+
return max(up, down)
6372
```
6473

6574
### **Java**
6675

6776
```java
77+
class Solution {
78+
public int wiggleMaxLength(int[] nums) {
79+
int up = 1, down = 1;
80+
for (int i = 1; i < nums.length; ++i) {
81+
if (nums[i] > nums[i - 1]) {
82+
up = Math.max(up, down + 1);
83+
} else if (nums[i] < nums[i - 1]) {
84+
down = Math.max(down, up + 1);
85+
}
86+
}
87+
return Math.max(up, down);
88+
}
89+
}
90+
```
91+
92+
### **C++**
93+
94+
```cpp
95+
class Solution {
96+
public:
97+
int wiggleMaxLength(vector<int>& nums) {
98+
int up = 1, down = 1;
99+
for (int i = 1; i < nums.size(); ++i) {
100+
if (nums[i] > nums[i - 1]) {
101+
up = max(up, down + 1);
102+
} else if (nums[i] < nums[i - 1]) {
103+
down = max(down, up + 1);
104+
}
105+
}
106+
return max(up, down);
107+
}
108+
};
109+
```
68110
111+
### **Go**
112+
113+
```go
114+
func wiggleMaxLength(nums []int) int {
115+
up, down := 1, 1
116+
for i := 1; i < len(nums); i++ {
117+
if nums[i] > nums[i-1] {
118+
up = max(up, down+1)
119+
} else if nums[i] < nums[i-1] {
120+
down = max(down, up+1)
121+
}
122+
}
123+
return max(up, down)
124+
}
125+
126+
func max(a, b int) int {
127+
if a > b {
128+
return a
129+
}
130+
return b
131+
}
69132
```
70133

71134
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public:
3+
int wiggleMaxLength(vector<int>& nums) {
4+
int up = 1, down = 1;
5+
for (int i = 1; i < nums.size(); ++i) {
6+
if (nums[i] > nums[i - 1]) {
7+
up = max(up, down + 1);
8+
} else if (nums[i] < nums[i - 1]) {
9+
down = max(down, up + 1);
10+
}
11+
}
12+
return max(up, down);
13+
}
14+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
func wiggleMaxLength(nums []int) int {
2+
up, down := 1, 1
3+
for i := 1; i < len(nums); i++ {
4+
if nums[i] > nums[i-1] {
5+
up = max(up, down+1)
6+
} else if nums[i] < nums[i-1] {
7+
down = max(down, up+1)
8+
}
9+
}
10+
return max(up, down)
11+
}
12+
13+
func max(a, b int) int {
14+
if a > b {
15+
return a
16+
}
17+
return b
18+
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
class Solution {
22
public int wiggleMaxLength(int[] nums) {
3-
if (nums.length < 2) {
4-
return nums.length;
5-
}
6-
int up = 1;
7-
int down = 1;
3+
int up = 1, down = 1;
84
for (int i = 1; i < nums.length; ++i) {
95
if (nums[i] > nums[i - 1]) {
10-
up = down + 1;
6+
up = Math.max(up, down + 1);
117
} else if (nums[i] < nums[i - 1]) {
12-
down = up + 1;
8+
down = Math.max(down, up + 1);
139
}
1410
}
1511
return Math.max(up, down);
1612
}
17-
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def wiggleMaxLength(self, nums: List[int]) -> int:
3+
up = down = 1
4+
for i in range(1, len(nums)):
5+
if nums[i] > nums[i - 1]:
6+
up = max(up, down + 1)
7+
elif nums[i] < nums[i - 1]:
8+
down = max(down, up + 1)
9+
return max(up, down)

0 commit comments

Comments
 (0)
Please sign in to comment.