标签:nums int up down Wiggle Subsequence 摆动 序列
这题,自己写,一点思路都没有!后来看了题解,觉得作者分析得有道理!首先,这个所谓的摆动序列可以分为上升摆动序列,也可分为下降摆动序列。上升摆动序列是最后一个元素相对来说值偏大,使得整个序列呈上升趋势,那么下降摆动序列也就能理解了。上升摆动序列我们可以用up数组表示,up[i]就表示到数组中i这个位置以来的最长上升摆动序列,那么down[i]就表示到i这个位置以来的最长下降摆动序列。那么,我们就可以来动态规划了!我们通过动态规划算出这两个数组,最后取第n-1位的二者的最大值就行了。
首先显而易见,如果nums[i-1]<nums[i],这个时候是呈上升趋势的,那么down[i] = down[i-1],up[i] = down[i-1]+1.看到这里你或许有很多疑问,为什么up[i]不是up[i-1]+1呢?你想啊,我这求的是摆动序列,不是上升序列啊!如果是up[i-1]+1.那不就求的是上升序列了?而down[i-1]+1才能既保证是摆动序列,又保证是最长的;这个时候因为当前的元素是使得整个序列呈上升趋势的,自然与下降摆动序列没什么关系,于是down[i]=down[i-1]了。那当nums[i-1]>nums[i]时,关系也就很自然能出来了。特别要注意的是,如果nums[i]=nums[i-1],这个时候既不是上升摆动序列也不是下降摆动序列,所以down[i]=down[i-1],up[i]=up[i-1].
1 public int wiggleMaxLength(int[] nums) { 2 int n = nums.length; 3 if (n < 2) { 4 return n; 5 } 6 int[] up = new int[n]; 7 int[] down = new int[n]; 8 up[0] = 1; down[0] = 1; 9 for (int i = 1; i < n; ++i) { 10 if (nums[i-1] < nums[i]) { 11 up[i] = down[i-1] + 1; 12 down[i] = down[i-1]; 13 } else if (nums[i-1] > nums[i]) { 14 up[i] = up[i-1]; 15 down[i] = up[i-1] + 1; 16 } else { 17 up[i] = up[i-1]; 18 down[i] = down[i-1]; 19 } 20 } 21 return Math.max(up[n-1], down[n-1]); 22 }
标签:nums,int,up,down,Wiggle,Subsequence,摆动,序列 来源: https://www.cnblogs.com/EvanTheGreat/p/15861256.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。