Secuencia de oscilación del algoritmo

Secuencia de oscilación del algoritmo

1. Secuencia de swing

Acostarse 376.

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

示例 1:

输入: [1,7,4,9,2,5]
输出: 6 
解释: 整个序列均为摆动序列。
示例 2:

输入: [1,17,5,10,13,15,10,5,16,8]
输出: 7
解释: 这个序列包含几个长度为 7 摆动序列,其中一个可为[1,17,10,13,10,16,8]。
示例 3:

输入: [1,2,3,4,5,6,7,8,9]
输出: 2
进阶:
你能否用 O(n) 时间复杂度完成此题?

Esta pregunta es una pregunta de nivel medio, pero si desea lograr la complejidad de tiempo y espacio de O (N) y O (1), no es tan simple.

La dificultad de esta pregunta es que podemos eliminar elementos, de modo que la secuencia que no puede ser originalmente una secuencia de swing se "conecta" en una secuencia de swing.

Podemos imaginar, si un cierto nodo puede estar en la secuencia de oscilación, ¿cuál debería ser el nodo antes que él (no necesariamente el primero antes)?

Si el nodo actual es mayor que el nodo anterior, entonces este nodo está en la secuencia descendente, si es menor que, entonces el nodo anterior está en la secuencia ascendente.

Por supuesto, no necesitamos registrar estos nodos directamente, solo necesitamos registrar la longitud. Podemos usar programación dinámica para resolverlo (¿qué es la programación dinámica? Conocemos el estado anterior y las condiciones actuales, y derivamos el estado actual, que en realidad es inducción matemática).

Defina dos variables hacia arriba y hacia abajo para representar la longitud de la cola de la subsecuencia descendente y la longitud de la cola de la subsecuencia ascendente, respectivamente. La subsecuencia ascendente y la subsecuencia descendente son interactivas. El código y los comentarios se dan a continuación.

    public int wiggleMaxLength(int[] nums) {
    
    
        if(nums.length<2){
    
    
            return nums.length;
        }
        //维护两个值,一个是上升序列头长度
        //另一个是下降序列头长度
        int up=1,down=1;
        for(int i=1;i<nums.length;i++){
    
    
            if(nums[i]>nums[i-1]){
    
    
                up=down+1;//上升和下降序列头相接
            }else if(nums[i]<nums[i-1]){
    
    
                down=up+1;//下降和上升序列头相接
            }
        }
        return Math.max(up,down);
    }

Supongo que te gusta

Origin blog.csdn.net/qq_23594799/article/details/105915576
Recomendado
Clasificación