package top100liked import ( "fmt" "testing" ) // https://leetcode.cn/problems/sliding-window-maximum/?envType=study-plan-v2&envId=top-100-liked func maxSlidingWindow(nums []int, k int) []int { if len(nums) == 0 || k == 0 { return []int{} } deque := make([]int, 0) // 存下标,单调递减(对应值) result := make([]int, 0, len(nums)-k+1) for i := 0; i < len(nums); i++ { // 1. 从队尾移除所有 <= nums[i] 的下标 for len(deque) > 0 && nums[deque[len(deque)-1]] <= nums[i] { deque = deque[:len(deque)-1] } // 2. 加入当前下标 deque = append(deque, i) // 3. 如果队首下标已出窗口,移除 if deque[0] < i-k+1 { deque = deque[1:] } // 4. 窗口形成后,记录最大值 if i >= k-1 { result = append(result, nums[deque[0]]) } } return result } func TestS11(t *testing.T) { fmt.Printf("%+v", maxSlidingWindow([]int{1, 3, -1, -3, 5, 3, 6, 7}, 3)) fmt.Printf("%+v", maxSlidingWindow([]int{1}, 1)) fmt.Printf("%+v", maxSlidingWindow([]int{9, 9, 8, 8, 7, 7, 6, 6}, 2)) fmt.Printf("%+v", maxSlidingWindow([]int{10, 9, 8, 7, 6, 5}, 3)) }