Files
leetcode/top-100-liked/11_test.go
T
2026-05-31 05:06:57 +10:00

43 lines
1.1 KiB
Go

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))
}