給你一個整數數組 nums,有一個大小爲 k 的滑動窗口從數組的最左側移動到數組的最右側。你只能夠看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。數組
返回滑動窗口中的最大值。app
示例 1: 輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3 輸出:[3,3,5,5,6,7] 解釋: 滑動窗口的位置 最大值 ---------- --- [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
示例 2: 輸入:nums = [1], k = 1 輸出:[1]
具體代碼以下:函數
/*雙端單調遞減隊列*/ func maxSlidingWindow(nums []int, k int) []int { if len(nums) == 0 { return []int{} } //用切片模擬一個雙端隊列 queue := []int{} result := []int{} //保存結果 for i := range nums { /*push()函數操做*/ //遍歷nums[i]和隊列尾部元素比較,若是大於隊列尾部元素 則將隊列尾部元素pop出隊 for len(queue) > 0 && nums[i] > queue[len(queue)-1] { //將比當前nums[i]小的元素都pop掉 queue = queue[:len(queue)-1] } //而後將當前元素放入queue中 多是窗口內元素的最大值 queue = append(queue, nums[i]) /*pop()函數操做*/ //每次彈出的時候,比較當前要彈出的數值是否等於隊列頭部出口元素的數值,若是相等則彈出。 if i >= k && nums[i-k] == queue[0] { queue = queue[1:] } if i >= k-1 { //放入結果數組 result = append(result, queue[0]) } } return result }