刷题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.
所有文章,坚持原创。如有转载,敬请标注出处。
原文地址:https://www.cnblogs.com/siweihz/p/12292256.html