大概题意:给定一个序列,求出最长摆动子序列的长度。所谓摆动序列:即为两个相邻元素的差的正负性为正负交替出现的序列。如[1, 7, 4, 9, 2, 5]就是摆动序列,而[1, 4, 7, 2, 5] 则不是。
题目要求我们找出原序列最长的摆动子序列的长度。显然,把原序列的两端的值和极大值极小值拿出来就是最长的摆动子序列了。当然,如果是那种全部元素都一样的序列,则最长子序列长度仅为1,具体代码如下,时间复杂度为O(n):
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n = nums.size() ;
if (!n) return 0 ;
int p = 0, allsame = true ;
int fnum = nums[0] ;
int st ;
for (int i=0; i<n; i++) {
if (nums[i] != fnum) {
st = i ;
allsame = false ;
if (nums[i] > fnum) p = 1 ;
else p = -1 ;
break ;
}
}
if (allsame) return 1;
int cnt = 2 ;
for (int i=st; i<n; i++) {
if (p*(nums[i] - nums[i-1]) < 0) {
cnt++ ;
p *= -1 ;
}
}
return cnt ;
}
};