滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sliding-window-maximum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

暴力法:

从0开始作为左边界,k-1作为右边界,求出当前窗口的最大值,然后窗口不断右移,不断找出最大值,直到右边界为length-1为止。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int length = nums.length;
        if(length == 0){
            return nums;
        }
        int[] result = new int[length-k+1];
        int left = 0;
        int right = left + k -1;
        int index = 0;
        while(right < length) {
            int cur = left, maximum=nums[left];
            while(cur<= right) {
                maximum=maximum>nums[cur]?maximum:nums[cur];
                ++cur;
            }
            result[index++] = maximum;
            left++;
            right++;    
        }
        return result;
    }
}

暴力法非常简单直白,然而,在每个窗口找最大值的时候,其实有相当多一部分元素之前已经比较过了,但这里还是要重复去比较,显得比较浪费。因此,我们可以记录以前比较的结果:最大值及其下标。在下一个窗口时,其实需要比较的只是新加进去的元素,亦即窗口的右边界,如果大于当前最大值,即更新,否则就保留。这个做法需要注意的是,上一个窗口的最大值,是否仍然存在于当前的窗口中。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int length = nums.length;
        if(length == 0){
            return nums;
        }
        int[] result = new int[length-k+1];
        int max = nums[0];
        int maxIndex = 0;
        int index = 0;
        for(int j = 1; j < k; j++) {
            if(nums[j] > max) {
                max = nums[j];
                maxIndex = j;
            }    
        }
        result[index++] = max;
        for(int left = 1; left < length-k+1; left++) {
            if(maxIndex < left) {
                max = nums[left];
                maxIndex = left;
                for(int idx = left+k-1; idx > left; idx--) {
                    if(nums[idx] > max) {
                        max = nums[idx];
                        maxIndex = idx;
                    }
                }
                result[index++] = max;
            }else {
                if(nums[left+k-1] > max) {
                    max = nums[left+k-1];
                    maxIndex = left+k-1;
                    result[index++] = max;
                }else {
                    result[index++] = max;
                }
            }
        }
        return result;
    }
}

 

posted on 2020-04-20 20:15  Jain_Shaw  阅读(181)  评论(0编辑  收藏  举报

导航