原题目
题目分析
方法一:直接遍历
将数组拆分,把每一部分分成一个单调序列,即单调递增和单调递减交替出现如
[1,17,5,10,13,15,10,5,16,8]
将其分成
1,17
17,5
5,10,13,15
15,10,5
5,16
16,8
元素的个数=序列个数+1
那么如何查找单调序列
即定一个最小值和一个最大值,然后遍历找每个序列的最小值和最大值,以此来判断是否满足要求
以上例为例
指针从首位开始遍历i=0,统计数res=1,若有数字存在则至少有1个数字满足条件
将数组第一个元素赋值给min=1;
循环将指针移动到序列最大位置即只要下一位大于等于当前值就往后移动一位.此时i=1
如果指针位置值大于min说明这个单调递增序列成立,返回值res+1
将当前最大值赋值给max=17
循环将指针移动到序列最小位置即即只要下一位小于等于当前值就往后移动一位.此时i=2
如果指针位置值小于min说明这个单调递增序列成立,返回值res+1
以此类推,进入第二次循环
完整代码
int wiggleMaxLength(int* nums, int numsSize){
if(numsSize==0)return 0;
int res=1,i=0,min,max;
while(i<numsSize-1)
{
min=nums[i];//当前序列最小值
while(i<numsSize-1&&nums[i]<=nums[i+1])//遍历至数组最大值
{
i++;
}
if(min<nums[i])//判断当前序列最大值是否大于最小值
{
res++;
}
max=nums[i];//当前序列最大值
while(i<numsSize-1&&nums[i]>=nums[i+1])//遍历到数组最小值
{
i++;
}
if(max>nums[i])//判断当前序列最大值是否大于最小值
{
res++;
}
}
return res;
}