2025-08-21 19:04:30 +08:00
|
|
|
|
package main
|
|
|
|
|
|
|
2025-08-22 04:31:58 +08:00
|
|
|
|
import "fmt"
|
2025-08-21 19:04:30 +08:00
|
|
|
|
|
|
|
|
|
|
func main() {
|
2025-08-22 04:31:58 +08:00
|
|
|
|
fmt.Println(maxSlidingWindow([]int{7, 2, 4}, 2))
|
2025-08-21 19:04:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
func maxSlidingWindow(nums []int, k int) []int {
|
2025-08-22 04:31:58 +08:00
|
|
|
|
if k > len(nums) {
|
|
|
|
|
|
return []int(nil)
|
2025-08-21 19:04:30 +08:00
|
|
|
|
}
|
2025-08-22 04:31:58 +08:00
|
|
|
|
numlist := make([]int, 0, k)
|
|
|
|
|
|
result := make([]int, 0)
|
2025-08-21 19:04:30 +08:00
|
|
|
|
|
2025-08-22 04:31:58 +08:00
|
|
|
|
for i := 0; i < len(nums); i++ {
|
|
|
|
|
|
if len(numlist) == 0 {
|
|
|
|
|
|
numlist = append(numlist, i)
|
|
|
|
|
|
if i >= k-1 {
|
|
|
|
|
|
result = append(result, nums[numlist[0]])
|
|
|
|
|
|
}
|
2025-08-21 19:04:30 +08:00
|
|
|
|
continue
|
|
|
|
|
|
}
|
2025-08-22 04:31:58 +08:00
|
|
|
|
if numlist[0] <= i-k {
|
|
|
|
|
|
numlist = numlist[1:]
|
|
|
|
|
|
}
|
|
|
|
|
|
p := len(numlist) - 1
|
|
|
|
|
|
//fmt.Println(numlist)
|
|
|
|
|
|
for {
|
|
|
|
|
|
if len(numlist) == 0 || p < 0 {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
if nums[numlist[p]] < nums[i] {
|
|
|
|
|
|
p--
|
|
|
|
|
|
} else {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
numlist = numlist[:p+1]
|
|
|
|
|
|
if len(numlist) < k {
|
|
|
|
|
|
numlist = append(numlist, i)
|
2025-08-21 19:04:30 +08:00
|
|
|
|
} else {
|
2025-08-22 04:31:58 +08:00
|
|
|
|
numlist = append(numlist[1:], i)
|
|
|
|
|
|
}
|
|
|
|
|
|
if i >= k-1 {
|
|
|
|
|
|
result = append(result, nums[numlist[0]])
|
2025-08-21 19:04:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-08-22 04:31:58 +08:00
|
|
|
|
//fmt.Println("result", result)
|
2025-08-21 19:04:30 +08:00
|
|
|
|
return result
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//func maxSlidingWindow(nums []int, k int) []int {
|
|
|
|
|
|
// queue := make([]int, k)
|
|
|
|
|
|
// result := make([]int, 0)
|
|
|
|
|
|
// for i := 0; i < k; i++ {
|
|
|
|
|
|
// queue[i] = nums[i]
|
|
|
|
|
|
// }
|
|
|
|
|
|
// maxnum := 0
|
|
|
|
|
|
// for i := 0; i < len(nums)-k+1; i++ {
|
|
|
|
|
|
// if i == 0 {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// maxnum = queuetmp[k-1]
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("result:", result)
|
|
|
|
|
|
// continue
|
|
|
|
|
|
// }
|
|
|
|
|
|
// fmt.Println("queue分割前:", queue)
|
|
|
|
|
|
// queueA := queue[1:]
|
|
|
|
|
|
// //fmt.Println("queueA", queueA)
|
|
|
|
|
|
// queueA = append(queueA, nums[i+k-1])
|
|
|
|
|
|
// queue = queueA
|
|
|
|
|
|
// fmt.Println("max", maxnum)
|
2025-08-22 04:31:58 +08:00
|
|
|
|
// fmt.Println("当前右边界:", nums[i+k-1])
|
|
|
|
|
|
// if nums[i+k-1] >= maxnum {
|
|
|
|
|
|
// maxnum = nums[i+k-1]
|
|
|
|
|
|
// result = append(result, nums[i+k-1])
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
// }
|
|
|
|
|
|
// //
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("queueA2", queueA)
|
|
|
|
|
|
// //fmt.Println("queueA", queue)
|
|
|
|
|
|
//
|
|
|
|
|
|
// fmt.Println("result:", result)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return result
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//func maxSlidingWindow(nums []int, k int) []int {
|
|
|
|
|
|
// queue := make([]int, k)
|
|
|
|
|
|
// result := make([]int, 0)
|
|
|
|
|
|
// for i := 0; i < k; i++ {
|
|
|
|
|
|
// queue[i] = nums[i]
|
|
|
|
|
|
// }
|
|
|
|
|
|
// maxnum := 0
|
|
|
|
|
|
// for i := 0; i < len(nums)-k+1; i++ {
|
|
|
|
|
|
// if i == 0 {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// maxnum = queuetmp[k-1]
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("result:", result)
|
|
|
|
|
|
// continue
|
|
|
|
|
|
// }
|
|
|
|
|
|
// fmt.Println("queue分割前:", queue)
|
|
|
|
|
|
// queueA := queue[1:]
|
|
|
|
|
|
// //fmt.Println("queueA", queueA)
|
|
|
|
|
|
// queueA = append(queueA, nums[i+k-1])
|
|
|
|
|
|
// queue = queueA
|
|
|
|
|
|
// fmt.Println("max", maxnum)
|
2025-08-21 19:04:30 +08:00
|
|
|
|
// fmt.Println("当前右边界:", nums[i+k-1])
|
|
|
|
|
|
// if nums[i+k-1] >= maxnum {
|
|
|
|
|
|
// maxnum = nums[i+k-1]
|
|
|
|
|
|
// result = append(result, nums[i+k-1])
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
// }
|
|
|
|
|
|
// //
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("queueA2", queueA)
|
|
|
|
|
|
// //fmt.Println("queueA", queue)
|
|
|
|
|
|
//
|
|
|
|
|
|
// fmt.Println("result:", result)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return result
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//func maxSlidingWindow(nums []int, k int) []int {
|
|
|
|
|
|
// queue := make([]int, k)
|
|
|
|
|
|
// result := make([]int, 0)
|
|
|
|
|
|
// for i := 0; i < k; i++ {
|
|
|
|
|
|
// queue[i] = nums[i]
|
|
|
|
|
|
// }
|
|
|
|
|
|
// maxnum := 0
|
|
|
|
|
|
// for i := 0; i < len(nums)-k+1; i++ {
|
|
|
|
|
|
// if i == 0 {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// maxnum = queuetmp[k-1]
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("result:", result)
|
|
|
|
|
|
// continue
|
|
|
|
|
|
// }
|
|
|
|
|
|
// fmt.Println("queue分割前:", queue)
|
|
|
|
|
|
// queueA := queue[1:]
|
|
|
|
|
|
// //fmt.Println("queueA", queueA)
|
|
|
|
|
|
// queueA = append(queueA, nums[i+k-1])
|
|
|
|
|
|
// queue = queueA
|
|
|
|
|
|
// fmt.Println("max", maxnum)
|
|
|
|
|
|
// fmt.Println("当前右边界:", nums[i+k-1])
|
|
|
|
|
|
// if nums[i+k-1] >= maxnum {
|
|
|
|
|
|
// maxnum = nums[i+k-1]
|
|
|
|
|
|
// result = append(result, nums[i+k-1])
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// queuetmp := make([]int, len(queue))
|
|
|
|
|
|
// copy(queuetmp, queue) // 深拷贝
|
|
|
|
|
|
// sort.Ints(queuetmp)
|
|
|
|
|
|
// result = append(result, queuetmp[k-1])
|
|
|
|
|
|
// }
|
|
|
|
|
|
// //
|
|
|
|
|
|
//
|
|
|
|
|
|
// //fmt.Println("queueA2", queueA)
|
|
|
|
|
|
// //fmt.Println("queueA", queue)
|
|
|
|
|
|
//
|
|
|
|
|
|
// fmt.Println("result:", result)
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return result
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
//func maxSlidingWindow(nums []int, k int) []int {
|
|
|
|
|
|
// result := make([]int, 0)
|
|
|
|
|
|
// nowmax := 0
|
|
|
|
|
|
// for i := 0; i < len(nums)-k+1; i++ {
|
|
|
|
|
|
// if i == 0 {
|
|
|
|
|
|
// tmp := nums[:k]
|
|
|
|
|
|
// sort.Ints(tmp)
|
|
|
|
|
|
// result = append(result, tmp[k-1])
|
|
|
|
|
|
// nowmax = tmp[k-1]
|
|
|
|
|
|
// continue
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if nums[i+k-1] > nowmax {
|
|
|
|
|
|
// result = append(result, nums[i+k-1])
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// result = append(result, nowmax)
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// }
|
|
|
|
|
|
// return result
|
|
|
|
|
|
//}
|