题目概述
- 算法说明
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
窗口大于数组长度的时候,返回空。 - 测试用例
输入:
[2,3,4,2,6,2,5,1],3
输出:
[4,4,6,6,6,5]
输入:
[10,14,12,11],0
输出:
[]
解析&参考答案
- 解析
依次取size个元素,排序后取最大值,然后按序返回输出即可。 - 参考答案
vim jz64.go
package main
import (
"fmt"
"sort"
)
func GetMax(array []int) int {
sort.Ints(array)
return array[len(array)-1]
}
func MaxInWindows(num []int, size int) []int {
if size > len(num) || size <= 0 {
return []int{}
}
var result []int
for i := 0; i <= len(num)-size; i++ {
tmpArr := []int{} //num[i : i+size], 如果直接截取会导致num的值被排序
for j := i; j < i+size; j++ {
tmpArr = append(tmpArr, num[j])
}
result = append(result, GetMax(tmpArr))
}
return result
}
func main() {
arr := []int{2, 3, 4, 2, 6, 2, 5, 1}
size := 3
result := MaxInWindows(arr, size)
fmt.Println(result)
}
注意事项
- to add
说明
- 当前使用 go1.15.8
- 参考 牛客网--剑指offer
标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。
注意!!!
- 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
- 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
- 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解