给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# 双指针,right,left分别代表头尾,right先向右移动,若A[left]-A[right]之间max和min的差值超过limit,则删除列表中nums[left]并使left向左移动,left每移动一次,记录一次A[left]-A[right]的距离,最后对距离进行比较,得出最长距离即为正确答案
from sortedcontainers import SortedList # 引入自动排序的列表
class Solution:
def longestSubarray(self, nums: List[int], limit: int) -> int:
left = right = finlong = 0 # 初始化双指针及最长距离为0
maxlong = SortedList()
while right < len(nums): # 若右指针小于列表长度
maxlong.add(nums[right]) # 将右指针所在位置数字保存至列表中
while maxlong[-1] - maxlong[0] > limit: # 若最大值与最小值之差大于limit
maxlong.remove(nums[left]) # 舍弃左指针所在位置数字
left += 1 # 左指针向右移动
finlong = max(finlong, right - left + 1) # 比较最大长度
right += 1
return finlong