[leetCode]1438. 绝对差不超过限制的最长连续子数组

题目

https://leetcode-cn.com/problems/longest-continuous-subarray-with-absolute-diff-less-than-or-equal-to-limit/

在这里插入图片描述

滑动窗口

使用双指针维护窗口移动,使用TreeMap或者双端队列来维护窗口中得最大值和最小值
TreeMap

class Solution {
    public int longestSubarray(int[] nums, int limit) {
        int n = nums.length;
        int left = 0;
        int right;
        int ans = 0;
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for (right = 0; right < n; right++) {
            map.put(nums[right], map.getOrDefault(nums[right], 0) + 1);
            while (map.lastEntry().getKey() - map.firstEntry().getKey() > limit) {
                map.put(nums[left], map.get(nums[left]) - 1);
                if (map.get(nums[left]) == 0)
                    map.remove(nums[left]);
                left++;
            }
            ans = Math.max(ans, right - left + 1);
        } 
        return ans;
    }
}

双端队列

class Solution {
    public int longestSubarray(int[] nums, int limit) {
        int n = nums.length;
        int left = 0, right, ans = 0;
        Deque<Integer> maxd = new ArrayDeque<>();
        Deque<Integer> mind = new ArrayDeque<>();
        for (right = 0; right < n; right++) {
            while (!maxd.isEmpty() && nums[right] > maxd.peekLast()) maxd.pollLast();  
            while (!mind.isEmpty() && nums[right] < mind.peekLast()) mind.pollLast(); 
            maxd.offer(nums[right]);
            mind.offer(nums[right]);
            while (maxd.peek() - mind.peek() > limit) {
                if (maxd.peek() == nums[left]) maxd.poll();
                if (mind.peek() == nums[left]) mind.poll();
                left++;
            }
            ans = Math.max(ans, right - left + 1);
        }  
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值