资讯专栏INFORMATION COLUMN

leetcode376. Wiggle Subsequence

CoffeX / 3321人阅读

摘要:题目要求扭动序列是指数组中的相邻两个元素的差保证严格的正负交替,如数组中相邻两个元素的差为,满足扭动序列的要求。现在要求从一个数组中,找到长度最长的扭动子序列,并返回其长度。即前一个元素和当前元素构成下降序列,因此代码如下

题目要求
A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than two elements is trivially a wiggle sequence.

For example, [1,7,4,9,2,5] is a wiggle sequence because the differences (6,-3,5,-7,3) are alternately positive and negative. In contrast, [1,4,7,2,5] and [1,7,4,5,5] are not wiggle sequences, the first because its first two differences are positive and the second because its last difference is zero.

Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence. A subsequence is obtained by deleting some number of elements (eventually, also zero) from the original sequence, leaving the remaining elements in their original order.

Example 1:

Input: [1,7,4,9,2,5]
Output: 6
Explanation: The entire sequence is a wiggle sequence.
Example 2:

Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
Explanation: There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
Example 3:

Input: [1,2,3,4,5,6,7,8,9]
Output: 2
Follow up:
Can you do it in O(n) time?

扭动序列是指数组中的相邻两个元素的差保证严格的正负交替,如[1,7,4,9,2,5]数组中相邻两个元素的差为6,-3,5,-7,3,满足扭动序列的要求。现在要求从一个数组中,找到长度最长的扭动子序列,并返回其长度。

思路和代码

这是一个可以通过动态规划来解决的问题。动态规划的特点就是,加入我知道第i个元素的结果,那么第i+1个元素的结果可以由其推到出来。这里假设我们知道,以第i个元素为止的最长子序列长度,包括上升序列up和下降序列down,则第i+1个元素的可能情况如下:

nums[i+1]>nums[i]: 即前一个元素和当前元素构成上升序列,因此up[i+1]=down[i]+1, down[i+1]=down[i],这是指以第i个元素为结尾的上升序列应当基于第i-1个元素为结尾的下降序列,而以第i个元素为结尾的下降序列,等同于基于第i-1个元素为结尾的下降序列。

nums[i+1]>nums[i]: 即前一个元素和当前元素构成下降序列,因此down[i+1]=up[i]+1, up[i+1]=up[i]

nums[i+1]=nums[i]: down[i+1]=down[i], up[i+1]=up[i]

代码如下:

    public int wiggleMaxLength(int[] nums) {
        if( nums.length == 0 ) return 0;
        int[] up = new int[nums.length];
        int[] down = new int[nums.length];
        up[0] = 1;
        down[0] = 1;
        for(int i = 1 ; i nums[i-1]) {
                up[i] = down[i-1] + 1;
                down[i] = down[i-1];
            }else if(nums[i] < nums[i-1]) {
                down[i] = up[i-1] + 1;
                up[i] = up[i-1];
            }else {
                down[i] = down[i-1];
                up[i] = up[i-1];
            }
        }
        return Math.max(up[nums.length-1], down[nums.length-1]);
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74428.html

相关文章

  • [LintCode/LeetCode] Wiggle Sort I & Wiggle Sor

    摘要:每隔两位交换一次,如,处理为。难点是会有相等的元素,而要求相邻元素除了外,不能相等。那么就不能取排序后相邻的元素交换,而要和后面的元素交换。例如牺牲空间的做法是,建立一个新数组,按照我们想要的规律放入元素,最后回原数组。 Wiggle Sort Problem Given an unsorted array nums, reorder it in-place such that num...

    linkFly 评论0 收藏0
  • [Leetcode] Wiggle Sort 摇摆排序

    摘要:就能满足题目要求。代码先将数组排序将数组中一对一对交换交换法复杂度时间空间思路题目对摇摆排序的定义有两部分如果是奇数,如果是偶数,所以我们只要遍历一遍数组,把不符合的情况交换一下就行了。 Wiggle Sort Given an unsorted array nums, reorder it in-place such that nums[0] = nums[2] = nums[i ...

    LancerComet 评论0 收藏0
  • [LeetCode] 280. Wiggle Sort

    Problem Given an unsorted array nums, reorder it in-place such that nums[0] = nums[2] nums[i-1]) swap(nums, i, i-1); } } } private void swap(int[] nums, int i, int j) { ...

    archieyang 评论0 收藏0
  • Wiggle Sort & II

    摘要:如果没复杂度的要求,先也可以,再交叉放入数字也可以。交叉的时候注意是按照,降序的。 Wiggle Sort 题目链接:https://leetcode.com/problems... 这道题允许等号,相对简单,有两种方法:1. sort然后交换奇数位和它下一位的元素,2. 不满足条件的时候直接交换 可以用递推来说明一下这么做的正确性: 假设到第i位之前都满足题目要求的关系 现在比较...

    Moxmi 评论0 收藏0
  • LeetCode[300] Longest Increasing Subsequence

    摘要:再用二分法找当前值应该在排好序的数组中的插入位置。因为要找的是最长的序列,所以每次将排好序的数组中替换成已经排好序的,会能保证得到的结果是最长的。保证升序相等也要替换这个值 LeetCode[300] Longest Increasing Subsequence Given an unsorted array of integers, find the length of longe...

    blankyao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<