加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

滑动窗口的最大值

发布时间:2020-12-13 21:12:08 所属栏目:PHP教程 来源:网络整理
导读:题目 给定1个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组{2,3,4,2,6,5,1}及滑动窗口的大小3,那末1共存在6个滑动窗口,他们的最大值分别为{4,5}; 针对数组{2,1}的滑动窗口有以下6个: {[2,4],1}, {2,[3,2],1}, {2,[4,6],

题目

给定1个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,5,1}及滑动窗口的大小3,那末1共存在6个滑动窗口,他们的最大值分别为{4,5}; 针对数组{2,1}的滑动窗口有以下6个:
{[2,4],1},
{2,[3,2],1},
{2,[4,6],[2,[6,5],1]}。

解题

方法1:暴力
时间复杂度:O(nk)

import java.util.*; public class Solution { public ArrayList<Integer> maxInWindows(int [] num,int size) { ArrayList<Integer> result = new ArrayList<Integer>(); int len = num.length; if(size<=0 || size> len) return result; for(int i=0;i<len;i++){ int max = Integer.MIN_VALUE; for(int k=0;k+i < len && k<size;k++){ max = max>num[i+k]?max:num[i+k]; } result.add(max); if(i+size==len) break; } return result; } }

方法2:利用队列
队列寄存滑动窗口中较大元素的下标

import java.util.ArrayList; import java.util.*; public class Solution { public ArrayList<Integer> maxInWindows(int[] num,int size) { ArrayList<Integer> result = new ArrayList<>(); if (num == null) { return result; } if (num.length < size || size < 1) { return result; } LinkedList<Integer> indexDeque = new LinkedList<>(); for (int i = 0; i < size; i++) { while (!indexDeque.isEmpty() && num[i] >= num[indexDeque.getLast()]) { indexDeque.removeLast(); } indexDeque.addLast(i); } for (int i = size; i < num.length ; i++) { result.add(num[indexDeque.getFirst()]); while (!indexDeque.isEmpty() && num[i] >= num[indexDeque.getLast()]) { indexDeque.removeLast(); } if (!indexDeque.isEmpty() && indexDeque.getFirst() <= (i - size)) { indexDeque.removeFirst(); } indexDeque.addLast(i); } result.add(num[indexDeque.getFirst()]); return result; } }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读