1438. 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