LeetCode 239:滑动窗口最大值 思考分析
給定一個(gè)數(shù)組 nums,有一個(gè)大小為 k 的滑動(dòng)窗口從數(shù)組的最左側(cè)移動(dòng)到數(shù)組的最右側(cè)。你只可以看到在滑動(dòng)窗口內(nèi)的 k
個(gè)數(shù)字。滑動(dòng)窗口每次只向右移動(dòng)一位。
返回滑動(dòng)窗口中的最大值。
進(jìn)階:
你能在線性時(shí)間復(fù)雜度內(nèi)解決此題嗎?
示例:
輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 輸出: [3,3,5,5,6,7] 解釋: 滑動(dòng)窗口的位置 最大值
[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
提示:
1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
1 <= k <= nums.length
暴力求解:超時(shí)
class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int maxnum=-10001;vector<int> result;int n= nums.size();//1、如果k> = nums.size, if(k>=n){for(int i=0;i<n;i++){if(nums[i]>=maxnum) maxnum=nums[i];}result.push_back(maxnum);return result;}//2、如果k<nums.sizeelse{int left=0;int right=0;for(left = 0;left<=n-k;left++){//更新左右邊界right=left+k-1;//更新最小值maxnum=-10001;for(int x=left;x<=right;x++){if(nums[x]>=maxnum) maxnum=nums[x]; }result.push_back(maxnum);}return result;}} };優(yōu)化思路:
可以想到暴力方法肯定是有時(shí)間浪費(fèi)的,在滑窗移動(dòng)的時(shí)候,滑窗內(nèi)插入一個(gè)新值,消失了一個(gè)舊值,有k-1個(gè)值仍然保留著。
我們只需要比較一下新插入的值和舊的k-1個(gè)值中的最大值,將得到的最大值賦給結(jié)果數(shù)組就可以了。
一開始我想的是用兩個(gè)容量為2的數(shù)組,分別存放第一大的數(shù)值和它的下標(biāo),第二大的數(shù)值和它的下標(biāo),但是在推導(dǎo)的時(shí)候發(fā)現(xiàn)一個(gè)問題:
錯(cuò)誤代碼,具體疑問見代碼注釋:
發(fā)現(xiàn)需要構(gòu)建一個(gè)從大到小排列的雙端隊(duì)列;
1、新的數(shù)入隊(duì)列,并按照其大小排列,然后將比它小的數(shù)全部出隊(duì)列(因?yàn)槲覀冃枰氖亲畲笾?#xff0c;只要隊(duì)列中有數(shù)比新入隊(duì)列的數(shù)要小就說明它們絕對(duì)不可能是最大值,最大值最起碼也是大于等于新入隊(duì)列的數(shù))。
2、觀察隊(duì)首(數(shù)值最大)的索引值是否在[left,right]之間,如果不在就出隊(duì)列,直到隊(duì)首索引值滿足在[left,right]之間
雖然AC了,但是效率不高,不過基本思路是符合大眾的:
不過上述的寫法仍然有些不簡潔,這里貼一下比較簡潔的寫法:
https://leetcode-cn.com/problems/sliding-window-maximum/solution/dan-diao-dui-lie-by-labuladong/
官方給出的dp思路,還得理解理解
https://leetcode-cn.com/problems/sliding-window-maximum/submissions/
為什么:兩數(shù)組一起可以提供兩個(gè)塊內(nèi)元素的全部信息。
考慮從下標(biāo) i 到下標(biāo) j的滑動(dòng)窗口。 根據(jù)定義,right[i] 是左側(cè)塊內(nèi)的最大元素, left[j] 是右側(cè)塊內(nèi)的最大元素。因此滑動(dòng)窗口中的最大元素為 max(right[i], left[j])
總結(jié)
以上是生活随笔為你收集整理的LeetCode 239:滑动窗口最大值 思考分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你是礼物剧情介绍
- 下一篇: 剑指 Offer 57 - II. 和为