zoukankan      html  css  js  c++  java
  • 滑动窗口最大值

    给定一个数组 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;
        }
    }
  • 相关阅读:
    注册表解锁
    Windows错误代码大全 2
    硬盘数据线的问题
    vs2010与C#4.0新特性
    (转载)C语言负数的移位运算
    (转载)看C语言编码转换负数的二进制表示方法
    (转载)C语言右移运算符的问题(特别当与取反运算符一起时)
    (转载)Qt中使用cout输出的方法
    (转载)QPainter的用法
    (转载)Qt计算MD5
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12740132.html
Copyright © 2011-2022 走看看