JZ59 滑动窗口的最大值,三种解法【较难】
描述
给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度或窗口长度为0的时候,返回空。
数据范围: 1≤n≤10000,0≤size≤10000,数组中每个元素的值满足 ∣val∣≤10000
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:[2,3,4,2,6,2,5,1],3
返回值:[4,4,6,6,6,5]
示例2
输入:[9,10,9,-7,-3,8,2,-6],5
返回值:[10,10,9,8]
示例3
输入:[1,2,3,4],5
返回值:[]
解法1:不使用队列与双指针
首先返回不符条件的值
创建一个list用于保存窗口最大值
使用双重for循环,利用Math函数判断每个窗口最大值并保存到list中
最后返回
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {if(num.length == 0 ||num.length < size || size == 0){return new ArrayList<Integer>();}ArrayList list = new ArrayList<Integer>();int max = -1;for(int i = 0; i < num.length; i++){max = num[i];for(int j = 1; j < size; j++){if((j+i)<num.length)max = Math.max(max,num[j+i]);}if(i<num.length-size+1)list.add(max);}return list;}
}
解法2:使用双指针
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {ArrayList<Integer> list = new ArrayList<>();if(size <= 0|| size > num.length)return list;int left = 0;int right = size - 1;while(right<num.length){list.add(getMax(num,left,right));left++;right++;}return list;}public int getMax(int[] num,int left,int right){if(num.length==0 || left<0 || right>num.length)return -1;int max = Integer.MIN_VALUE;for(int i = left;i <= right;i++){max = max > num[i] ? max : num[i];}return max;}
}
解法3:使用队列
import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {ArrayList<Integer> list=new ArrayList<>();if(num==null||num.length==0|| num.length<size||size==0){return list;}ArrayDeque<Integer>deque=new ArrayDeque<>();for (int i=0;i<size;i++){while (!deque.isEmpty()&&num[i]>=num[deque.peekLast()]){deque.pollLast();}deque.addLast(i);}for (int i=size;i<num.length;i++){list.add(num[deque.peekFirst()]);while (!deque.isEmpty()&&num[i]>=num[deque.peekLast()]){deque.pollLast();}if (!deque.isEmpty()&&i- deque.peekFirst()>=size){deque.pollFirst();}deque.addLast(i);}list.add(num[deque.peekFirst()]);return list;}
}
JZ59 滑动窗口的最大值,三种解法【较难】相关推荐
- 滑动窗口的最大值java
题目描述: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4 ...
- 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值
一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...
- 62、滑动窗口的最大值
一.题目 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- 【LeetCode】1. 盛最多水的容器:C#三种解法
题目:https://leetcode-cn.com/problems/container-with-most-water/ 盛最多水的容器 难度:中等 给你 n 个非负整数 a1,a2,...,an ...
- (笔试题)滑动窗口的最大值
题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...
- java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- [简单题]自定义取余(三种解法)C++实现
题目链接: 点击打开原题链接 题目意思,就是标题意思. 第一种解法:(加法迭代)用加法来模拟这个(17行代码) int mod256WithoutMod(int number) {if (number ...
- jsp判断字符串相等_最长回文字符串三种解法
先解释一下什么是回文字符串,比如说字符串"aba",无论是从先往后读取还是从后往前读取,结果都是一样的.当给定很长的字符串时,如何快速获取到最长的回文字符串,这也是大厂比较常见的算 ...
最新文章
- 【深入Cocos2d-x】探索Cocos2d-x中的内存管理-引用计数和自动释放池
- 2021年科研学术海报Poster模板
- unsigned int mysql_mysql 中int类型字段unsigned和signed的探索
- java 生成随机数_Java 生成随机数的 N 种方法
- android 坐标绘图 缩放,在缩放/缩小或拖放到Android后获取画布坐标
- python中eval函数调用_如何从Python exec()/eval()调用中获取结果?
- dubbo学习总结三 消费端
- fread 单独测试没有问题 在正式项目里面丢数据 可能是系统资源不足 预读出了问题
- 如何使用Jmeter对WebSocket进行压力测试
- jquery读写cookie
- 计算机上已安装某个第三方应用程序,防止电脑第三方软件“被”安装 3招彻底屏蔽不明软件...
- hexutil加解密_EncodeUtil(各种格式的编码解码工具类)
- 有必要考国二mysql_国二证有用吗
- MATLAB符号运算——积分
- 【Java实现】南京地铁导航系统的简单实现(三)—— 图形化界面的设计
- VAD自适应算法降噪控制毕业论文【matlab】
- 用ps做个一寸的照片
- [超详细] Git 远程仓库及回滚日志操作
- 智能链杀机器人 芬shib,慈善回流是怎样的合约部署原理?
- ifconfig命令找不到
热门文章
- 分布式游戏服务器全服匹配玩法设计
- 二阶三阶四阶魔方旋转公式
- 超五类屏蔽双绞线和计算机电缆区别,五类线、六类线、超五类线的定义和区别...
- 杭电OJ 1248 不死族巫妖王 完全背包问题 字节跳动 研发岗编程原题
- 扎心!为什么有的人,干什么都能成功
- 计算机系学生推荐电脑游戏本,有什么学生笔记本电脑推荐 学生笔记本电脑推荐...
- 模板类中 typename的用法,以及函数的定义和声明
- android rom 慢,安卓系统运行慢怎么办
- 找到第一个不重复的字符
- Java大佬是怎样炼成的1-2