美文网首页
算法挑战100天-Ten(mid)

算法挑战100天-Ten(mid)

作者: holmes000 | 来源:发表于2020-10-22 17:30 被阅读0次

    类别:数组

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

    我的解:没想法

    最优解:O(nk)

    public int longestSubarray(int[] nums, int limit) {
            //这里维护的是最大值们对应的下标
            Deque<Integer> maxQ=new LinkedList<>();
            Deque<Integer> minQ=new LinkedList<>();
            int ans=0;
            //窗口左沿
            int start=0;
            //窗口右沿
            for (int end=0; end<nums.length;end++){
                //右沿元素进入窗口、维护最大值单调队列
                while(!maxQ.isEmpty() && nums[maxQ.peekLast()]<nums[end]){
                    maxQ.pollLast();
                }
                maxQ.add(end);
                //右沿元素进入窗口、维护最小值单调队列
                while(!minQ.isEmpty() && nums[minQ.peekLast()]>nums[end]){
                    minQ.pollLast();
                }
                minQ.add(end);
    
                //如果当前窗口的最大值最小值的差大于 limit,则不断缩小窗口(左沿++),直至最大值变小或者最小值变大从而满足 limit 限制
                while(!maxQ.isEmpty() && !minQ.isEmpty() && nums[maxQ.peek()]-nums[minQ.peek()]>limit){
                    if(maxQ.peek()<=start) maxQ.poll();
                    if(minQ.peek()<=start) minQ.poll();
                    start++;
                }
                ans = Math.max(ans,end-start+1);
            }
            return ans;
        }
    

    差异点:利用双端队列,滑动窗口思路

    相关文章

      网友评论

          本文标题:算法挑战100天-Ten(mid)

          本文链接:https://www.haomeiwen.com/subject/rtdpmktx.html