376 Wiggle Subsequence 摆动序列

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.
Examples:
Input: [1,7,4,9,2,5]
Output: 6
The entire sequence is a wiggle sequence.

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

Input: [1,2,3,4,5,6,7,8,9]
Output: 2

Follow up:
Can you do it in O(n) time?

详见:https://leetcode.com/problems/wiggle-subsequence/description/

C++:

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums)
    {
        if (nums.empty()) 
        {
            return 0;
        }
        vector<int> p(nums.size(), 1);
        vector<int> q(nums.size(), 1);
        for (int i = 1; i < nums.size(); ++i) 
        {
            for (int j = 0; j < i; ++j) 
            {
                if (nums[i] > nums[j])
                {
                    p[i] = max(p[i], q[j] + 1);
                }
                else if (nums[i] < nums[j])
                {
                    q[i] = max(q[i], p[j] + 1);
                }
            }
        }
        return max(p.back(), q.back());
    }
};

 参考:https://www.cnblogs.com/grandyang/p/5697621.html

转载于:https://www.cnblogs.com/xidian2014/p/8848513.html

涟漪 (rippling.cpp/c) 4.1 问题描述 下雨天,一滴水落到水面上,泛起一片涟漪。 小可发现,水落到水面上,会使得水面变得高低起伏,非常好看。由此,小可想到,如果一个序列也满足这样的规律,那么我们就可以看作是这个序列也泛起了涟漪。 准确来说,如果一个序列泛起了涟漪,那么除了首尾位置的元素以外,每个位置的元素,要么比两侧相邻的数字小,要么比两侧相邻的数字大。 例如序列 1,3,2,5,3,4 满足这个规律,但是 2,3,4,1,2 不满足,因为第二个位置的元素 比左侧元素 要大,但是要比右侧元素 要小。 注意:如果一个序列的长度小于等于 ,那么一定是泛起了涟漪。 但是满足这个规律的序列终究是少数,小可想知道,如果现在有一个长度为 的序列,每次操作可以将任意一个位置的数字修改成任意一个新数字。那么想让这个序列泛起涟漪,最最小的修改次数是多少? 4.2 输入格式 输入第一行包含一个正整数 ,代表数组长度。 接下来一行包含 个正整数,其中第 个数字表示数组的第 个元素 。 4.3 输出格式 对于每一组询问,输出一行一个整数表示最少修改次数。 4.4 输入样例1 6 1 1 2 2 3 3 4.5 输出样例1 3 4.6 样例1说明 可以将序列改为 或者 等,都是可以的。 3 2 4 2 n n n i i ai [1, 5, 2, 4, 1, 3] [1, 0, 2, −1, 5, 3] 4.7 输入样例2 11 703 702 703 703 702 703 702 702 702 700 702 4.8 输出样例2 3 4.9 数据范围 对于 10% 的数据,有 。 对于 30% 的数据,有 。 对于另外 10% 的数据,有 ,且数组元素各不相同。 对于另外 10% 的数据,有 ,且数组元素全部相同。 对于 100% 的数据,有 。 1 ≤ n ≤ 20 1 ≤ n ≤ 1000 1 ≤ n ≤ 105 1 ≤ n ≤ 105 1 ≤ n ≤ 105, 1 ≤ ai ≤ 109(不用dp,c++)
最新发布
10-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值