问题描述与解题思路
确定本题的状态表示
-
Δ \Delta Δ dp[i] 表示:以 i 位置元素为结尾的所有的子序列中,最长的摆动序列的长度
-
f[i] 表示:以 i 位置元素为结尾的所有的子序列中,最后一个位置呈现 “上升” 趋势的最长摆动序列的长度
-
g[i] 表示:以 i 位置元素为结尾的所有的子序列中,最后一个位置呈现 “下降” 趋势的最长摆动序列的长度
确定本题的状态转移方程

填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
// class Solution {
// public:
// int wiggleMaxLength(vector<int>& nums) {
// int n=nums.size();
// vector<int> dp(n);
// // dp[i]的含义是以nums[i]为结尾的最长摆动序列的长度
// dp[0]=1;
// if(nums[0]==nums[1]) dp[1]=1;
// else dp[1]=2;
// int ret=0;
// for(int i=2;i<n;i++){
// // cout << "i="<<i<< endl;
// // cout << "nums["<< i-2<<"]="<< nums[i-2] << endl;
// // cout << "nums["<< i-1<<"]="<< nums[i-1] << endl;
// // cout << "nums["<< i<<"]="<< nums[i] << endl;
// if(nums[i]==nums[i-1]){
// dp[i]=1;
// }else if(nums[i-1]==nums[i-2]){
// dp[i]=2;
// }
// else if((nums[i]-nums[i-1])*(nums[i-1]-nums[i-2])<0)
// dp[i]=dp[i-1]+1;
// else{
// dp[i]=2;
// }
// cout << "dp["<< i<<"]="<< dp[i]<< endl;
// ret=max(ret,dp[i]);
// }
// return ret;
// }
// };
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
else if(n==1) return 1;
vector<int> f(n),g(n);
// f[i]的含义是以nums[i]为结尾的,最后一个位置呈现上升趋势的最长摆动序列的长度
// g[i]的含义是以nums[i]为结尾的,最后一个位置呈现下降趋势的最长摆动序列的长度
f[0]=1;g[0]=1;
if(nums[0]==nums[1]){
f[1]=1;g[1]=1;
}
else if(nums[0]<nums[1]){
f[1]=2;g[1]=1;
}else{
f[1]=1;g[1]=2;
}
if(n==2){
return max(f[1],g[1]);
}
// cout << "f[1]="<< f[1]<< endl;
// cout << "g[1]="<< g[1]<< endl;
int ret=0;
for(int i=2;i<n;i++){
// cout << "i="<<i<< endl;
// cout << "nums["<< i-2<<"]="<< nums[i-2] << endl;
// cout << "nums["<< i-1<<"]="<< nums[i-1] << endl;
// cout << "nums["<< i<<"]="<< nums[i] << endl;
if(nums[i]==nums[i-1]){
f[i]=f[i-1];
g[i]=g[i-1];
}
else if(nums[i-1]<nums[i]){
f[i]=g[i-1]+1;
g[i]=g[i-1];
}else{
f[i]=f[i-1];
g[i]=f[i-1]+1;
}
// cout << "f["<< i<<"]="<< f[i]<< endl;
// cout << "g["<< i<<"]="<< g[i]<< endl;
ret=max({ret,f[i],g[i]});
}
return ret;
}
};
366

被折叠的 条评论
为什么被折叠?



