43 lines
1.1 KiB
Go
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))
|
|
}
|