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;
        }
    }
  • 相关阅读:
    解决Sublime 3提示 Sublime Text Error while loading PyV8 binary
    SQL中select与set的区别
    Microsoft Dynamics CRM 2011 安装完全教程
    sql语句优化
    CRM牛人博客
    Customize Spring @RequestParam Deserialization for Maps and/or Nested Objects
    Customize Spring @RequestParam Deserialization for Maps and/or Nested Objects
    Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
    Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
    使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)
  • 原文地址:https://www.cnblogs.com/WakingShaw/p/12740132.html
Copyright © 2011-2022 走看看