LeetCode-1438. Subarreglo continuo más largo con diferencia absoluta ... [Medio] -Análisis y código (Java)

LeetCode-1438. Subarreglo continuo más largo con diferencia absoluta menor o igual al límite [Subarreglo continuo más largo con diferencia absoluta menor o igual al límite] [Medio] -Análisis y código [Java]

1. Tema

Dado un número de matriz de números enteros y un límite de número entero que representa el límite, devuelva la longitud de la submatriz continua más larga. La diferencia absoluta entre dos elementos cualesquiera de la submatriz debe ser menor o igual que el límite.
Si no hay una submatriz que cumpla la condición, se devuelve 0.

Ejemplo 1:

输入:nums = [8,2,4,7], limit = 4
输出:2 
解释:所有子数组如下:
[8] 最大绝对差 |8-8| = 0 <= 4.
[8,2] 最大绝对差 |8-2| = 6 > 4. 
[8,2,4] 最大绝对差 |8-2| = 6 > 4.
[8,2,4,7] 最大绝对差 |8-2| = 6 > 4.
[2] 最大绝对差 |2-2| = 0 <= 4.
[2,4] 最大绝对差 |2-4| = 2 <= 4.
[2,4,7] 最大绝对差 |2-7| = 5 > 4.
[4] 最大绝对差 |4-4| = 0 <= 4.
[4,7] 最大绝对差 |4-7| = 3 <= 4.
[7] 最大绝对差 |7-7| = 0 <= 4. 
因此,满足题意的最长子数组的长度为 2 。

Ejemplo 2:

输入:nums = [10,1,2,4,7,2], limit = 5
输出:4 
解释:满足题意的最长子数组是 [2,4,7,2],其最大绝对差 |2-7| = 5 <= 5 。

Ejemplo 3:

输入:nums = [4,2,2,2,4,4,2,2], limit = 0
输出:3

inmediato:

  • 1 <= núm. De longitud <= 10 ^ 5
  • 1 <= números [i] <= 10 ^ 9
  • 0 <= límite <= 10 ^ 9

Fuente: botón de permanencia (LeetCode)
enlace: https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit los
derechos de autor del botón del collar todos red. Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Dos, análisis y código

1. Ventana corredera + deque

(1) Pensando

Diseñe una ventana deslizante, donde la diferencia máxima del valor absoluto de los elementos no exceda el límite, entonces la longitud máxima del intervalo en el proceso deslizante es la solución.
Para contar los valores máximo y mínimo en la ventana deslizante dentro de la complejidad O (n), se puede diseñar una deque para mantener la cola en tiempo real durante el proceso de deslizamiento de la ventana. Tome la cola de valor máximo como ejemplo, en la que el valor máximo, el segundo valor más grande, etc. de la cola actual se almacenan en orden desde el principio hasta el final, y el primer elemento de la cola es el valor máximo en la ventana actual.

(2) Código

class Solution {
    
    
    public int longestSubarray(int[] nums, int limit) {
    
    
        int n = nums.length, ans = 0;
        Deque<Integer> small = new LinkedList<>(), large = new LinkedList<>();//记录窗口中大、小值
        for (int l = 0, r = 0; r < n; r++) {
    
    //滑动窗口
            while (!small.isEmpty() && nums[r] < small.peekLast())//弹出比当前右端点大的小值
                small.pollLast();
            small.offerLast(nums[r]);
            while (!large.isEmpty() && nums[r] > large.peekLast())//弹出比当前右端点小的大值
                large.pollLast();
            large.offerLast(nums[r]);
            while (large.peekFirst() - small.peekFirst() > limit) {
    
    //超出限制,移动左端点
                if (small.peekFirst() == nums[l])
                    small.pollFirst();
                if (large.peekFirst() == nums[l])
                    large.pollFirst();
                l++;
            }
            ans = Math.max(ans, r - l + 1);//计算区间长度
        }
        return ans;
    }
}

(3) Resultados

Tiempo de ejecución: 34 ms, superando al 90,51% de los usuarios
en todas las presentaciones de Java ; consumo de memoria: 55,1 MB, superando al 65,18% de los usuarios en todas las presentaciones de Java.

Tres, otro

Nada.

Supongo que te gusta

Origin blog.csdn.net/zml66666/article/details/114233506
Recomendado
Clasificación