滑动窗口最大值—leetcode239
難度困難462
給定一個(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 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7提示:
- 1 <= nums.length <= 10^5
- -10^4?<= nums[i]?<= 10^4
- 1 <= k?<= nums.length
?
思路:采用雙端隊(duì)列,保證雙端隊(duì)列的第一個(gè)值是當(dāng)前窗口的的最大值,代碼主要維護(hù)兩個(gè)容器,一個(gè)vector輸出結(jié)果,一個(gè)deque來(lái)保存數(shù)組索引值,接下來(lái)遍歷數(shù)組,根據(jù)條件把數(shù)組的索引值插到deque當(dāng)中,具體的判斷條件有兩個(gè):
1、當(dāng)當(dāng)前數(shù)nums[i]大于deque中最后索引對(duì)應(yīng)的值,那么刪除這個(gè)索引,知道deque中最后索引對(duì)應(yīng)的值大于nums[i]為止
2、當(dāng)當(dāng)前索引 i-que.front()>=k 就表示que.front()不在當(dāng)前i對(duì)應(yīng)的滑動(dòng)窗口中了,于是pop_front,同時(shí)在遍歷過(guò)程中保存deque front()索引對(duì)應(yīng)的最大值
class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;int n = nums.size();if(n<k) return result;deque<int> que;for(int i=0;i<k;++i){while(!que.empty() && nums[que.back()]<nums[i]){que.pop_back();}que.push_back(i);}result.push_back(nums[que.front()]);for(int i=k;i<n;++i){while(!que.empty() && nums[que.back()]<nums[i]){que.pop_back();}if(!que.empty() && i-que.front()>=k)que.pop_front();que.push_back(i);result.push_back(nums[que.front()]);}return result;} };?
總結(jié)
以上是生活随笔為你收集整理的滑动窗口最大值—leetcode239的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 比特位计数—leetcode338
- 下一篇: 和为K的子数组—leetcode560