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 continuous subarray such that the absolute difference between any two elements is less than or equal to limit.

In case there is no subarray satisfying the given condition return 0.

 

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 <= 10^5
  • 1 <= nums[i] <= 10^9
  • 0 <= limit <= 10^9

思路:sliding window求min/max ,用priority queue或者deque,感觉总结之前做的题很有必要啊!大佬们似乎都有这个习惯,自己太懒了。。

系列题目合集 https://leetcode.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/discuss/609771/JavaC%2B%2BPython-Deques-O(N)

class Solution(object):
    def longestSubarray(self, nums, limit):
        """
        :type nums: List[int]
        :type limit: int
        :rtype: int
        """
        # sliding window max/min
        from collections import deque
        dq1,dq2 = deque(),deque()
        res = 1
        sid = 0
        for tid,t in enumerate(nums):
            while dq1 and dq1[-1]t: dq2.pop()
            dq1.append(t)
            dq2.append(t)
            # 一个个把前面的pop出来
            while dq1 and dq2 and dq1[0]-dq2[0]>limit:
                if dq1[0]==nums[sid]: dq1.popleft()
                if dq2[0]==nums[sid]: dq2.popleft()
                sid += 1
            res = max(res, tid-sid+1)
        return res

s=Solution()
print(s.longestSubarray(nums = [8,2,4,7], limit = 4))
print(s.longestSubarray([10,1,2,4,7,2], limit = 5))

 

你可能感兴趣的:(leetcode,优先队列,sliding,window)