题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{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]}。
解题思路
- 设置滑动窗口为k,可以扫描每个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口为k,则需要O(k)时间才能找出滑动窗口的最大值。对于长度为n的输入数组,该方法的时间复杂度为O(kn)。
算法图解
写法简单不做图了,书上的那种优化的写法我一时没看明白。?
参考代码:
package offer;
/**
* 队列的最大值
*/
public class Offer59 {
public static void main(String[] args) {
int nums[] = {2, 3, 4, 2, 6, 2, 5, 1};
findMaxInQueue(nums, 3);
}
/**
* 暴力 时间复杂度O(nk)
*
* @param nums
* @param K
*/
static void findMaxInQueue(int nums[], int K) {
if (nums == null) {
return;
}
if (nums.length < 2) {
System.out.println(nums[0]);
}
for (int i = 0; i < nums.length - 2; i++) {
int max = nums[i];
for (int j = 1; j < K; j++) {
if (max < nums[i + 1]) {
max = nums[i + 1];
}
i++;
}
i = i - 2;
System.out.println(max);
}
}
}
附录
该题源码在我的 ?Github 上面!