u
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
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))
|
||||
}
|
||||
Reference in New Issue
Block a user