其他分享
首页 > 其他分享> > 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit

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

作者:互联网

原题链接在这里: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:

题解:

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