我是靠谱客的博主 勤劳裙子,最近开发中收集的这篇文章主要介绍双指针-滑动窗口的最大值-JZ64,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{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]}。

窗口大于数组长度的时候,返回空

示例1

输入: [2,3,4,2,6,2,5,1],3
返回值: [4,4,6,6,6,5]

思路1:
最大堆保存滑动窗口数据,
时间复杂度:O(n*logk), 其中n为数组大小,k为窗口大小
offer(),remove()时间复杂度均为log(N)
空间复杂度:O(k),k为窗口大小

代码1: 最大堆

import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> res = new ArrayList<>();
if (num == null || num.length < size || size <= 0) {
return res;
}
PriorityQueue<Integer> maxQueue = new PriorityQueue<>((o1, o2)->o2-o1);
int i = 0;
//初始化最大堆
while (i < size) {
maxQueue.offer(num[i]);
i++;
}
res.add(maxQueue.peek());
while (i < num.length) {
maxQueue.remove(num[i-size]);
maxQueue.offer(num[i]);
res.add(maxQueue.peek());
i++;
}
return res;
}
}

思路2:
双指针的思路:
快指针right 指向滑动窗口下一个要加入的位置
慢指针maxIndex指向滑动窗口内最大值
每次直接拿num[right] 和 num[maxIndex]进行比较,如果maxIndex正好是滑动窗口的第一个数字,代表右移的话正好最大值移除,需要特殊处理,重新遍历一下滑动窗口获取最大值
时间复杂度:O(n), 其中n为数组大小,k为窗口大小
基本可以认是为O(n),最坏为O(n*k)
空间复杂度:O(k),k为窗口大小

代码2

import java.util.*;
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
ArrayList<Integer> res = new ArrayList<>();
if (num == null || num.length < size || size <= 0) {
return res;
}
//maxIndex表示滑动窗口内最大值下标
int maxIndex = 0;
for (int i = 1; i < size; i++){
if (num[i] >= num[maxIndex]) {
maxIndex = i;
}
}
res.add(num[maxIndex]);
// right表示下一个加入滑动窗口的值
int right = size;
while (right < num.length) {
if (num[right] >= num[maxIndex]) {
maxIndex = right;
} else {
//滑动窗口最大值为第一个位置的情况 右移后最大值需要重新计算
if (right - size == maxIndex) {
int tempMaxIndex = right - size + 1;
for (int i = tempMaxIndex + 1; i <= right; i++) {
if (num[i] >= num[tempMaxIndex]) {
tempMaxIndex = i;
}
}
maxIndex = tempMaxIndex;
}
}
right++;
res.add(num[maxIndex]);
}
return res;
}
}

最后

以上就是勤劳裙子为你收集整理的双指针-滑动窗口的最大值-JZ64的全部内容,希望文章能够帮你解决双指针-滑动窗口的最大值-JZ64所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部