Skip to content

Commit 3e1acfd

Browse files
committed
feat: add wiggle max length dynamic programming
1 parent 27f3932 commit 3e1acfd

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@
7575
"__bits": "cpp",
7676
"clocale": "cpp",
7777
"fstream": "cpp",
78-
"iomanip": "cpp"
78+
"iomanip": "cpp",
79+
"set": "cpp"
7980
},
8081
"C_Cpp.errorSquiggles": "Disabled",
8182
"fileheader.LastModifiedBy": "Chacha",
432 Bytes
Binary file not shown.

leetcode/greedy_algorithm/wiggle_subsequence.cpp

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: Chacha
33
* @Date: 2022-04-16 23:18:10
44
* @Last Modified by: Chacha
5-
* @Last Modified time: 2022-04-17 00:00:28
5+
* @Last Modified time: 2022-04-17 23:05:41
66
*/
77

88
/**
@@ -37,6 +37,7 @@
3737

3838
#include <iostream>
3939
#include <vector>
40+
#include <string.h>
4041

4142
using namespace std;
4243

@@ -45,7 +46,11 @@ class Solution
4546
private:
4647
/* data */
4748
public:
49+
int dp[1005][2];
50+
4851
int wiggleMaxLength(vector<int> &nums);
52+
53+
int wiggleMaxLength1(vector<int> &nums);
4954
};
5055

5156
/**
@@ -90,14 +95,63 @@ int Solution::wiggleMaxLength(vector<int> &nums)
9095
return result;
9196
};
9297

98+
/**
99+
* 动态规划
100+
*
101+
* 很容易发现,对于我们当前考虑的这个数,要么是作为山峰(即nums[i] > nums[i-1]),要么是作为山谷(即nums[i] < nums[i - 1])。
102+
* 1. 设dp状态dp[i][0],表示考虑前i个数,第i个数作为山峰的摆动子序列的最长长度
103+
* 2. 设dp状态dp[i][2],表示考虑前i个数,第i个数作为山谷的摆动子序列的最长长度
104+
*
105+
* 则转移方程为:
106+
* 1. dp[i][0] = max(dp[i][0], dp[j][1] + 1),其中 0 < j < i 且 nums[j] < nums[i],表示将nums[i]接到前面某个山谷后面,作为山峰。
107+
* 2. dp[i][1] = max(dp[i][1], dp[j][0] + 1),其中 0 < j < i 且 nums[j] > nums[i],表示将nums[i]接到前面某个山峰后面,作为山谷。
108+
*
109+
* 初始状态:
110+
* 由于一个数可以接到前面的某个数后面,也可以以自身为子序列的起点,所以初始状态为:dp[0][0] = dp[0][1] = 1。
111+
*
112+
*/
113+
int Solution::wiggleMaxLength1(vector<int> &nums)
114+
{
115+
// void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
116+
memset(dp, 0, sizeof dp);
117+
118+
dp[0][0] = dp[0][1] = 1;
119+
120+
for (int i = 1; i < nums.size(); i++)
121+
{
122+
dp[i][0] = dp[i][1] = 1;
123+
124+
for (int j = 0; j < i; j++)
125+
{
126+
if (nums[j] > nums[i])
127+
{
128+
dp[i][1] = max(dp[i][1], dp[j][0] + 1);
129+
}
130+
}
131+
132+
for (int j = 0; j < i; j++)
133+
{
134+
if (nums[j] < nums[i])
135+
{
136+
dp[i][0] = max(dp[i][0], dp[j][1] + 1);
137+
}
138+
}
139+
}
140+
141+
return max(dp[nums.size() - 1][0], dp[nums.size() - 1][1]);
142+
};
143+
93144
int main(int argc, char const *argv[])
94145
{
95146
Solution s;
96147
vector<int> nums = {1, 7, 4, 9, 2, 5};
97148
vector<int> nums1 = {1, 17, 5, 10, 13, 15, 10, 5, 16, 8};
98149

99-
cout << "[1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength(nums) << endl;
100-
cout << "[1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength(nums1) << endl;
150+
cout << "wiggleMaxLength [1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength(nums) << endl;
151+
cout << "wiggleMaxLength [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength(nums1) << endl;
152+
153+
cout << "\n wiggleMaxLength1 [1, 7, 4, 9, 2, 5]:" << s.wiggleMaxLength1(nums) << endl;
154+
cout << "wiggleMaxLength1 [1, 17, 5, 10, 13, 15, 10, 5, 16, 8]:" << s.wiggleMaxLength1(nums1) << endl;
101155

102156
return 0;
103157
}

0 commit comments

Comments
 (0)