239. 滑动窗口最大值(困难)
题目描述:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值 。
考察重点:维护一个队列,队列元素由大到小排列,队头为窗口最大元素
/**golang中自带的list数据结构l := list.New()//取头部和尾部l.Front()l.Back()// 尾部添加l.PushBack("canon")// 头部添加l.PushFront(67)// 尾部添加后保存元素句柄element := l.PushBack("fist")// 在fist之后添加highl.InsertAfter("high", element)// 在fist之前添加noonl.InsertBefore("noon", element)// 使用l.Remove(element)
*/
func maxSlidingWindow(nums []int, k int) []int {que := list.New()lennum := len(nums) - k + 1res := make([]int, lennum)for i, p := 0, 0; i < len(nums); i++ {for que.Len() != 0 && nums[que.Back().Value.(int)] < nums[i] {que.Remove(que.Back()) //小于 nums[i]的全部出队}que.PushBack(i) // 目前索引加入队列if i - que.Front().Value.(int) + 1 > k { // 当目前索引与队首元素相距大于k,说明已经不在一个滑动窗口中,则移除队首元素(每次只向后1位,所以只需判断和队首元素的差距)que.Remove(que.Front())}if i >= k-1 { // 当 目前索引 达到了滑动窗口大小时,就可以开始记录每次的最大值了res[p] = nums[que.Front().Value.(int)]p ++}}return res
}