zoukankan      html  css  js  c++  java
  • 刷题239. Sliding Window Maximum

    一、题目说明

    题目239. Sliding Window Maximum,给一个数组,和窗口长度,窗口每次向右滑动1位,返回滑动窗口的最大值。时间复杂度要求是线性。

    二、我的解答

    最直接的办法就是brute force,但是性能不足,复杂度是O(kN):

    class Solution{
    	public:
    		//brute force
    		vector<int> maxSlidingWindow(vector<int>& nums, int k){
    			int start = 0,curMax=0;
    			vector<int> result;
    			while(start+k <= nums.size()){
    				curMax = nums[start];
    				for(int i=start;i<start+k;i++){
    					if(nums[i]>curMax) curMax = nums[i];
    				}
    				result.push_back(curMax);
    				start++;
    			}
    			
    			return result;
    		}
    };
    

    性能如下:

    Runtime: 100 ms, faster than 16.44% of C++ online submissions for Sliding Window Maximum.
    Memory Usage: 13 MB, less than 86.89% of C++ online submissions for Sliding Window Maximum.
    

    三、优化措施

    用双端队列实现:

    class Solution{
    	public:
    		//use deque to store index,window.front() to store the max value of current window
    		//nums[i],将双端队列deque从尾部开始把每个小于nums[i]的数去除。
    		//nums[i-k]等于deque头的元素,要把deque的头去除掉,相当于一个最大值移出了窗口
    		vector<int> maxSlidingWindow(vector<int>& nums, int k){
    			vector<int> result;
    			if(k==0 || nums.size()<1) return result;
    			deque<int> window;
    			//init the first k nums
    			for(int i=0;i<k;i++){
    				while(! window.empty() && nums[i]>nums[window.back()]){
    					window.pop_back();
    				}
    				window.push_back(i);
    			} 
    			result.push_back(nums[window.front()]);
    			
    			//other data
    			for(int i=k;i<nums.size();i++){
    				if(!window.empty() && window.front()<=i-k){
    					window.pop_front();
    				}
    				while(!window.empty() && nums[i]>nums[window.back()]){
    					window.pop_back();
    				}
    				window.push_back(i);
    				result.push_back(nums[window.front()]);
    			}
    			return result;
    		}
    };
    

    性能如下:

    Runtime: 60 ms, faster than 63.43% of C++ online submissions for Sliding Window Maximum.
    Memory Usage: 13.3 MB, less than 59.02% of C++ online submissions for Sliding Window Maximum.
    
    所有文章,坚持原创。如有转载,敬请标注出处。
  • 相关阅读:
    自我学习——javascript——基本技巧
    Edge Code CC卡死原因
    Django中ORM介绍和字段及字段参数
    Web框架本质及第一个Django实例
    Python连接MySQL数据库之pymysql模块使用
    Bootstrap框架
    jQuery快速入门
    前端基础之BOM和DOM
    前端基础之JavaScript
    前端基础之CSS
  • 原文地址:https://www.cnblogs.com/siweihz/p/12292256.html
Copyright © 2011-2022 走看看