算法学习100天——14 滑动窗口2
题目地址(239. 滑动窗口最大值)
https://leetcode-cn.com/problems/sliding-window-maximum/
题目描述
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1
输出:[1]
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
思路
利用滑动窗口思想,每一次维护一个长度为k的滑动窗口,只需要遍历找出窗口中的最大值输出就好
代码
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int max = nums[0];
int right = 0;
int maxIndex = 0;
int[] res = new int[nums.length - k + 1];
int j = 0;
for(int i = 0; i < nums.length - k + 1; i++){
// 如果记录的最大值已经走出窗口,清除最大值
if(i > maxIndex){
maxIndex = i;
max = nums[i];
for (int m = i; m <= i + k - 1 && m < nums.length; m++){
if (nums[m] > max){
max = nums[m];
maxIndex = m;
}
}
}
// 找到有边界
while(right - i + 1 <= k){
// 获取当前窗口的最大值和下标
if(nums[right] >= max){
max = nums[right];
maxIndex = right;
}
right ++;
}
res[j++] = max;
}
return res;
}
}
结果
执行用时:1998 ms, 在所有 Java 提交中击败了5.01%的用户
内存消耗:59.2 MB, 在所有 Java 提交中击败了17.50%的用户
enmmmmm,时间复杂度挺高的,不过总归是过了
官方解法的队列 我再学学吧 后面再补充