网站 语言切换怎么做,暗色系网站,内蒙古城乡建设和住房建设厅网站,网站发布小说封面怎么做376. Wiggle Subsequence
题目理解
给定一个数组#xff0c;相邻两个数计算差值。差值排成的序列是正负相间的#xff0c;那这个数组就是一个wiggle 数组。例如数组[1,7,4,9,2,5]#xff0c;差值序列是(6,-3,5,-7,3)。原数组用坐标轴表示如下。 思路是#xff1a;在一段…376. Wiggle Subsequence
题目理解
给定一个数组相邻两个数计算差值。差值排成的序列是正负相间的那这个数组就是一个wiggle 数组。例如数组[1,7,4,9,2,5]差值序列是(6,-3,5,-7,3)。原数组用坐标轴表示如下。 思路是在一段连续上升或者连续下降的线段上那只保留两端的断点这是贪心思想的体现去掉中间的断点就能使得子序列符合要求。例如在AB线段上去掉中间点A1,A2A1,A2A_1,A_2在BC线段上去掉B1,B2B1,B2B_1,B_2那留下在子序列[A,B,C]就是符合要求的并且是长度最长的wiggle子序列。 证明要证明上面的思路是正确的。可以使用反证法。假如在一段连续上升的线段中不是保留最顶点B而是留下A2A2A_2点删除一个点添加一个点总长度不发生变化。那会影响其他点吗A2BA2BA_2 。B点之后是一段下降的线段。A2A2script typemath/tex idMathJax-Element-879BBscript typemath/tex idMathJax-Element-880BBscript typemath/tex idMathJax-Element-881A2A2script typemath/tex idMathJax-Element-882A2A2A_2替换B没有任何好处。可以用同理分析下降线段中去掉中间点是最合理的。 学习对于每一种解决方法是应该有证明的。此外本题目还要考虑各种变化趋势增加测试数据。 考虑先直线再折线先折线再直线折线折线直线折线直线折线。
public int wiggleMaxLength(int[] nums) {if(nums.length1){return nums.length;}int ans 1;int diff nums[1]-nums[0];if(diff!0){ans;}for(int i2;inums.length;i){if(nums[i]!nums[i-1]){if(diff * (nums[i]-nums[i-1])0){ans;}diff nums[i]-nums[i-1];}}return ans;}