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))