当前位置:
首页
文章
前端
详情

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

题目链接

https://leetcode-cn.com/problems/sliding-window-maximum/

题目内容

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:
滑动窗口的位置|最大值 -|- [1 3 -1] -3 5 3 6 7|3| 1 [3 -1 -3] 5 3 6 7|3| 1 3 [-1 -3 5] 3 6 7| 5| 1 3 -1 [-3 5 3] 6 7| 5| 1 3 -1 -3 [5 3 6] 7|6| 1 3 -1 -3 5 [3 6 7]|7|

分析

1、创建一个双端队列用来存储nums数组中元素的索引; 2、创建一个结果数组存储达到窗口大小时,在窗口内的元素; 3、没达到窗口大小时:如果双端队列是空的,那么直接从队尾插入元素的索引,如果双端队列不为空,需要保证双端队列中的索引在nums中的值是递减的。达到窗口大小时,直接将双端队列的头部元素在nums中的值存储到结果数组。

如图: 先放动态图:

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

再放静态图;

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

代码

import jdk.jshell.spi.ExecutionControl;

import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums.length<=0)
            throw new RuntimeException("nums是空的!");
        //创建双端队列
        Deque<Integer> deque = new LinkedList<>();
        //创建一个结果的ArrayList
        ArrayList<Integer> resut_array = new ArrayList<>();
        for(int i=0;i<nums.length;i++){
            //如果双端队列不为空,而且到了窗口长度
            if(!deque.isEmpty() && deque.peek() == i-k)
                //移除第一个元素
                deque.pollFirst();
            //保证nums【双端队列中的索引】是一个递减数列
            while(!deque.isEmpty() && nums[deque.getLast()] < nums[i])
                deque.pollLast();

            //把当前元素的索引加到双端队列中
            deque.offer(i);
            //如果是窗口大小
            if(i >= k-1)
                resut_array.add(nums[deque.peek()]);
        }

        //ArrayList转换成整型数组
        int[] res = resut_array.stream().mapToInt(Integer::intValue).toArray();
        return res;
    }
}

欢迎关注

欢迎大家的关注

扫描下方的二维码关注我的微信公众号:code随笔 Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。