问题描述:
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口的最大值
示例:
输入: nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3
输出: [3 3 5 5 6 7]
解题思路:
考虑多种情况,1. 当nums的长度小于等于k或者为0时,直接计算当前数据的最大值进行返回;2. 当nums的长度大于k时,需要计算每个窗口出现数的最大值,由于滑动窗口每次滑动一个位置,当一个窗口内的最大值的位置确定后且在下一个窗口内,下一次计算的位置可以由该最大值的位置作为起始值进行计算,循环直到结束;
package main
import (
"fmt"
)
func slidingMax(nums []int, k int) (res []int) {
length := len(nums)
if length == 0 {
return
}
if length <= k {
max := nums[0]
for _, v := range nums {
if v > max {
max = v
}
}
res = append(res, max)
return
}
maxPos := 0
for i := 0; i <= length - k; i++ {
if maxPos < i {
maxPos = i
}
for j := maxPos; j < i + k; j++ {
if nums[j] > nums[maxPos] {
maxPos = j
}
}
res = append(res, nums[maxPos])
}
return
}
func main() {
fmt.Println(slidingMax([]int{1, 3, -1, -3, 5, 3, 6, 7}, 3))
fmt.Println(slidingMax([]int{1}, 1))
}