题目描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值 。
解法 - 左右扫描
算法的主要思想,是将输入数组分割成有 k 个元素的块,然后分别从左右两个方向进行扫描统计块内的最大值,最后进行合并。这里有一些借鉴了分治和动态规划的思想。
开头元素为 i ,结尾元素为 j 的当前滑动窗口可能在一个块内,也可能在两个块中
建立两个数组 一个从左往右遍历依次保存当前最大值
循环遍历比较大小
代码片段
int n = nums.length;
// 定义数组长度
int [] num = new int[n-k+1];
int [] left = new int[n];
int [] right = new int[n];
for (int i = 0; i < nums.length; i++) {
// 为第一个元素 直接添加 或者为当前块第一个元素
if (i % k == 0){
left[i] = nums[i];
}else {
// 将当前值与left数组当前下标-1的元素比较大小
left[i] = Math.max(left[i-1],nums[i]);
}
int s = n - i - 1;
if (s % k == k -1 || n-1 == s){
// 为最后一个元素 直接添加 或者为当前块第一个元素
right[s] = nums[s];
}else {
// 将当前值与right数组当前下标+1的元素比较大小
right[s] = Math.max(right[s+1],nums[s]);
}
}
// 遍历比较大小 添加至结果数组
for (int j = 0; j < n - k + 1; j++) {
num[j] = Math.max(right[j],left[j+k-1]);
}
return num;