zoukankan      html  css  js  c++  java
  • LeetCode 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.

    class Solution {
    public:
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            int len = nums.size();
            if (len < 1 && k < 1) {
                return vector<int>();
            }
            deque<int> ids;
            vector<int> res(len - k + 1);
            
            for (int i=0; i<len; i++) {
                // remove values which can't be max value
                while (!ids.empty() && nums[ids.back()] < nums[i]) {
                    ids.pop_back();
                }
                
                ids.push_back(i);
                if (i < k - 1) {
                    continue;
                }
                
                res[i - k + 1] = nums[ids.front()];
                
                // remove left most index which not in the range any more
                int lmost = i - k + 1;
                while (!ids.empty() && ids.front() <= lmost) {
                    ids.pop_front();
                }
            }
            return res;
        }
    };
    

    第二轮:
    稍微简洁一点

    class Solution {
    public:
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            
            int len = nums.size();
            vector<int> res;
            list<int> que;
            for (int i=0; i<len; i++) {
                while (!que.empty() && nums[i] >= nums[que.back()]) {
                    que.pop_back();
                }
                
                que.push_back(i);
                
                while (!que.empty() && i - que.front() >= k) {
                    que.pop_front();
                }
                if (i >= k - 1) {
                    res.push_back(nums[que.front()]);
                }
            }
            
            return res;
        }
    };
    
  • 相关阅读:
    mina之小小总结(标准的菜鸟级别,行家勿入)
    tomcat(就一句话,自己的日记性质)
    MINA转自itoyo
    java web(没含量的,百科上的)
    解决VS.NET 2008中aspx文件没有设计界面
    正则表达式教程
    [VB] Option Explicit
    sql自定義函數 包含遊標
    sql 中 null+others=?
    实用手机号、IP、身份证号、歌曲查询接口
  • 原文地址:https://www.cnblogs.com/lailailai/p/4660286.html
Copyright © 2011-2022 走看看