暴力解
真的暴力,不過也揭示了這個題的本質,你需要在o(1)的時間裡找到視窗內的最大值
。因為遍歷陣列需要o(n)
。
class
solution;if
(nums.
size()
==0)return res;
int mm=int_min;
for(
int i=
0;isize()
-k+1
;i++
)return res;}}
;
單調遞減的雙向佇列
**與這個題解相同,僅為個人重寫後的記錄。
在視窗移動的過程中,乙個數字加入,乙個數字離開,保證隨時訪問最大值。
對於加入的數字
nums[i]
,如果他比以前的數字大,那麼自從遇見它開始,以前的數字沒有存在的必要,因為它們會在nums[i]
之前會離開,因此可以直接將這些元素推出佇列,整個佇列滿足降序大小排列,滿足對應的nums座標(進入的先後)公升序
。對於將要離開的數字
nums[i-k]
,存在兩種可能,一、它已經被後續的更大元素擠出佇列,二、它是最大元素,如果它是最大元素,需要在佇列中刪除它。
#define debug(x) cout<<#xdescqueue
data.
push_back
(n);
}void
pop(
int n)
}int
max()}
;class
solution;if
(nums.
size()
==0)return res;
descqueue dq;
for(
int i=
0;isize()
;i++
)else
}return res;}}
;
動態規劃 LeetCode 239 滑動視窗最大值
class solution public int maxslidingwindow int nums,int k int numlen nums.length if nums null numlenmaxheap new priorityqueue a,b nums b nums a for in...
LeetCode 239 滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1...
leetcode239滑動視窗最大值
給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗 k 內的數字。滑動視窗每次只向右移動一位。返回滑動視窗最大值。示例 輸入 nums 1,3,1,3,5,3,6,7 和 k 3 輸出 3,3,5,5,6,7 解釋 滑動視窗的位置 最大值 1...