ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit

2022-08-04 09:34:29  阅读:292  来源: 互联网

标签:nums max Continuous Equal limit min diff Less absolute


原题链接在这里:https://leetcode.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/

题目:

Given an array of integers nums and an integer limit, return the size of the longest non-empty subarray such that the absolute difference between any two elements of this subarray is less than or equal to limit.

Example 1:

Input: nums = [8,2,4,7], limit = 4
Output: 2 
Explanation: All subarrays are: 
[8] with maximum absolute diff |8-8| = 0 <= 4.
[8,2] with maximum absolute diff |8-2| = 6 > 4. 
[8,2,4] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4,7] with maximum absolute diff |8-2| = 6 > 4.
[2] with maximum absolute diff |2-2| = 0 <= 4.
[2,4] with maximum absolute diff |2-4| = 2 <= 4.
[2,4,7] with maximum absolute diff |2-7| = 5 > 4.
[4] with maximum absolute diff |4-4| = 0 <= 4.
[4,7] with maximum absolute diff |4-7| = 3 <= 4.
[7] with maximum absolute diff |7-7| = 0 <= 4. 
Therefore, the size of the longest subarray is 2.

Example 2:

Input: nums = [10,1,2,4,7,2], limit = 5
Output: 4 
Explanation: The subarray [2,4,7,2] is the longest since the maximum absolute diff is |2-7| = 5 <= 5.

Example 3:

Input: nums = [4,2,2,2,4,4,2,2], limit = 0
Output: 3

Constraints:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
  • 0 <= limit <= 109

题解:

If we need to find a maximum of subarray, we maintain a decreasing deque.

If we need to find a minimum of subarray, we maintain a increasing deque.

While max.peekFirst() - min.peekFirst() > limit, we need to get move the left pointer of window.

Time Complexity: O(n). n = nums.length. 

Space: O(n).

AC Java:

 1 class Solution {
 2     public int longestSubarray(int[] nums, int limit) {
 3         int res = 1;
 4         LinkedList<Integer> min = new LinkedList<>();
 5         LinkedList<Integer> max = new LinkedList<>();
 6         int n = nums.length;
 7         int i = 0;
 8         for(int j = 0; j < n; j++){
 9             while(!min.isEmpty() && min.peekLast() > nums[j]){
10                 min.pollLast();
11             }
12             
13             while(!max.isEmpty() && max.peekLast() < nums[j]){
14                 max.pollLast();
15             }
16             
17             min.addLast(nums[j]);
18             max.addLast(nums[j]);
19             while(max.peekFirst() - min.peekFirst() > limit){
20                 if(min.peekFirst() == nums[i]){
21                     min.pollFirst();
22                 }
23                 
24                 if(max.peekFirst() == nums[i]){
25                     max.pollFirst();
26                 }
27                 
28                 i++;
29             }
30             
31             res = Math.max(res, j - i + 1);
32         }
33         
34         return res;
35     }
36 }

 

标签:nums,max,Continuous,Equal,limit,min,diff,Less,absolute
来源: https://www.cnblogs.com/Dylan-Java-NYC/p/16549459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有