zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Sliding Window Maximum

    Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.

    For example,
    Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

    Window position                Max
    ---------------               -----
    [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
    

    Therefore, return the max sliding window as [3,3,5,5,6,7].

    Note: 
    You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.

    Follow up:
    Could you solve it in linear time?

    Hint:

    1. How about using a data structure such as deque (double-ended queue)?
    2. The queue size need not be the same as the window’s size.
    3. Remove redundant elements and the queue should store only elements that need to be considered

    https://leetcode.com/problems/sliding-window-maximum/

     

     

     


     

     

    首先是非线性复杂度的解法,直接用js的数组来模拟双向队列。

     

     1 /**
     2  * @param {number[]} nums
     3  * @param {number} k
     4  * @return {number[]}
     5  */
     6 var maxSlidingWindow = function(nums, k) {
     7     var window = [], result = [];
     8     for(var i = 0; i < nums.length; i++){
     9         if(window.length === k){
    10             result.push(findMax(window));
    11             window.shift();
    12         }
    13         window.push(nums[i]);
    14     }
    15     if(window.length === k){
    16         result.push(findMax(window));
    17     }
    18     return k !== 0 ? result : [];
    19 
    20     function findMax(arr){
    21         var max = -Infinity;
    22         for(var i = 0; i < arr.length; i++){
    23             if(arr[i] > max){
    24                 max = arr[i];
    25             }
    26         }
    27         return max;
    28     }
    29 };

    线性复杂度的解法。

    https://leetcode.com/discuss/46578/java-o-n-solution-using-deque-with-explanationa

    核心思想就是在队列头保存最大元素的下标。

    每一轮循环:

    1.先移除过期的元素;

    2.从后往前移出不可能是结果的元素,两种情况:

    i)比如队列是[2,3],这一轮的元素是4,那么max一定是4,2和3都可以移除了;

    ii)比如队列是[5,3],这一轮的元素是4,那么要移出3,最后的结果应该是[5,4]。

    因为等5过期了,4可能就是最大的元素了,所以要放着。为什么可以放心地移除3呢,因为4的过期时间肯定比3久,而且大于3。 <-- 此处是难点

    3.往队列里放入这一轮的元素,如果长度大于等于窗口长度就输出结果。

    保存下标而非值是为了之后可以方便地找出过期的元素,需要值的时候直接可以通过下标访问nums。

     

     1 /**
     2  * @param {number[]} nums
     3  * @param {number} k
     4  * @return {number[]}
     5  */
     6 var maxSlidingWindow = function(nums, k) {
     7     var window = [], index = -1, result = [];
     8     for(var i = 0; i < nums.length; i++){
     9         while(window.length !== 0 && window[0] < i - k + 1){
    10             window.shift();
    11         }
    12         while(window.length !== 0 && nums[window[window.length - 1]] < nums[i]){
    13             window.pop();
    14         }
    15         window.push(i);
    16         if(i >= k - 1){
    17             result.push(nums[window[0]]);
    18         }
    19     }
    20     return result;   
    21 };

     

     

     

     

  • 相关阅读:
    As3 模拟As2.0LoadVars 传参
    OracleERP库存管理
    OracleERP采购管理
    Oracle EBS R12文件系统结构
    OracleERP物料
    ORACLE APPLICATION 数据结构
    WIN7 X64 Setup Oracle Developer Suite 10g
    实例14. 库存补充操作——再订购点计划(Reorder Point Planning)
    OracleERP供应商
    ORACLE EBS环境下可以使用的开发语言和工具
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4657526.html
Copyright © 2011-2022 走看看