滑动窗口最大值

问题描述:

给定一个数组 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))
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值