力扣239(Java)- 滑动窗口最大值(困难)
题目:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
示例 2:
输入:nums = [1], k = 1
输出:[1]
提示:
- 1 <= nums.length <= 105
- -104 <= nums[i] <= 104
- 1 <= k <= nums.length
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
第一次做,做不出来,但是看了:代码随想录视频讲解 和 评论区题解,觉得思路还是挺好理解的,多看几遍,多看几个题解总有一个是我能明白的!
1 class Solution {
2 public int[] maxSlidingWindow(int[] nums, int k) {
3 //定义一个双端队列
4 Deque<Integer> queue = new ArrayDeque<>();
5 //定义一个结果数组,实际运算一下就知道长度的表达式
6 //1,2,3,4,5, k= 2,有4个最大值
7 int[] ans = new int[nums.length - k + 1];
8 int index = 0;
9 for (int i = 0; i < nums.length; i++){
10 //如果加入的数值大于队列尾部的数值,则将队列尾部的数值弹出直到满足大到小的顺序
11 while (!queue.isEmpty() && nums[i] > nums[queue.peekLast()] ){
12 queue.pollLast();
13 }
14 //再将当前元素下标加入到队列中
15 queue.offerLast(i);
16 //判断队列出口的下标在不在窗口范围内
17 //不在则弹出队首
18 if (queue.peekFirst() < i - k + 1){
19 queue.pollFirst();
20 }
21 //将最大值加入ans中
22 //满足窗口大小
23 if (i + 1 >= k){
24 ans[index++] = nums[queue.peekFirst()];
25 }
26 }
27 return ans;
28 }
29 }
我主要是想熟悉并记录一下队列的基本操作,已经忘光了感觉,如果面试出这道题我感觉我能说出来思路就很不错啦,毕竟我真的太菜了(留下不学无术的泪水)
双端队列的定义:
Deque<Integer> queue = new ArrayDeque<>();
常用方法:
①插入:
- 队头插入:addFirst 和 offerFirst
- 对尾插入:addLast 和 offerLast
- 注意:推荐优先使用offerFirst和offerLast, 因为addfirst和addLast会在队列满的时候抛出异常。
②删除:
- 队头删除:removeFirst 和 pollFirst
- 队尾删除:removeLast 和 pollLast
- 注意:如果队列是空,pollFirst和pollLast 会返回空, 但是removeFirst和removeLast会抛出异常。
③获取:
- 获取队首元素:getFirst 和 peekFirst
- 获取队尾元素:getLast 和 peekLast
- 注意:当队列是空的时候, peekFirst和peekLast返回空,但是getFirst 和 getLast会抛出异常。
④返回栈的大小:size()
⑤判断队列为空:isEmpty()
力扣239(Java)- 滑动窗口最大值(困难)的更多相关文章
- Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解
题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧 ...
- Java实现 LeetCode 239 滑动窗口最大值
239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...
- 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...
- Leetcode 239.滑动窗口最大值
滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: ...
- LeetCoded第239题题解--滑动窗口最大值
滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进 ...
- 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素
基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...
- [思维提升|干货All in]6种算法解决LeetCode困难题:滑动窗口最大值
为了更好的阅读体验,欢迎阅读原文: [思维提升|干货All in]6种算法解决LeetCode困难题:滑动窗口最大值 (eriktse.com) 最近在leetcode遇到一道非常经典的题目:239. ...
- [Swift]LeetCode239. 滑动窗口最大值 | Sliding Window Maximum
Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...
- 滑动窗口最大值的golang实现
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值 输入: nums = [, ...
- [Leetcode]双项队列解决滑动窗口最大值难题
这道题是从优先队列的难题里面找到的一个题目.可是解法并不是优先队列,而是双项队列deque 其实只要知道思路,这一道题直接写没有太大的问题.我们看看题 给定一个数组 nums,有一个大小为 k 的滑动 ...
随机推荐
- cpprest示例微服务链路嵌套调用层数1000以及跟踪
本demo使用本人两个github项目cpprestsdk4mingw,zhepler-wxWdigets编写,一个简单的rest服务器cpprestbox,只提供GET方法方便测试,可以添加修改ap ...
- Vue + Element-ui实现后台管理系统(6)---权限管理思路讲解
权限管理思路讲解 有关后台管理系统之前写过五篇博客,看这篇之前最好先看下这五篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system 1.Vue + El ...
- [bzoj2120]数颜色/维护队列 (分块)
数颜色/维护队列 [做题笔记] 此生第一道不贺题解\(AC\)的分块蓝题!!! 题目描述 墨墨@hs_mo购买了一套 \(N\) 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨 ...
- 【Leetcode】768. 最多能完成排序的块 II
题目(链接) arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个"块",并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数组相同. 我们最多能 ...
- AI+软件工程:10倍提效!用ChatGPT编写系统功能文档
系统功能文档是一种描述软件系统功能和操作方式的文档.它让开发团队.测试人员.项目管理者.客户和最终用户对系统行为有清晰.全面的了解. 通过ChatGPT,我们能让编写系统功能文档的效率提升10倍以上. ...
- .NET Emit 入门教程:第五部分:动态生成方法(MethodBuilder 与 DynamicMethod)
前言: 当我们涉及到在运行时生成和定义方法时,便需要使用到C#中的两个关键类之一:MethodBuilder 或 DynamicMethod. 这两者都属于反射(Reflection.Emit)的一部 ...
- flink scala 从Oracle同步数据到MySql
pom <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ...
- Unable to load library ‘xxx‘: 找不到指定的模块。找不到指定的模块。 Can‘t obtain InputStream for win32-x86-64/xxx.dll
我使用的是 <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</a ...
- CLion和WSL配置MPI运行及调试环境
本文将介绍 Windows 下,使用 CLion 和 WSL 配置 MPI 运行及调试环境的方法. 0. 前提 阅读本文前,请确保: Windows 下已启用 WSL2,并安装了任一 Linux 发行 ...
- KingbaseES数据库使用kdb_database_link扩展常见问题
KingbaseES数据库使用kdb_database_link扩展常见问题 kdb_database_link主要功能是为了满足@link语法的适配,让用户应用的代码能够适用于更宽泛的产品而无需在移 ...