【棧和隊列】leetcode239——滑動窗口最大值

編號239:滑動窗口最大值

給你一個整數數組 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
}
相關文章
相關標籤/搜索