【Golang】LeetCode-剑指Offer-面试题59 - I - 滑动窗口的最大值【两种写法】

解法一:队列——解题思路

  • 设置变量 max 用于记录窗口中的最大值的索引
  • 窗口滑动后
    • 如果出去的值(的索引)是最大值(的索引),那么新的窗口则需要重新查找最大值并设置 max
      • 这里使用双指针查找窗口中的最大值 / (最大值的索引)
    • 如果出去的值不是最大值(的索引),则判断新进来的值是否大于当前的最大值
      • 不大于则最大值(的索引)可不变
      • 大于则将进来的值(的索引)作为最大值(的索引)

写法一:比较下标

–执行用时:16 ms --内存消耗:6.4 MB

func maxSlidingWindow(nums []int, k int) []int {
    if len(nums) == 0 || k <= 0 || k > len(nums){
        return nil
    }
    var maxNums []int
    //max用于记录窗口中的最大值的索引
    max := -1
    for i:=0;i<=len(nums)-k;i++{
        l := i
        r := i+k-1
        //如果出去的值是最大值(的索引),那么新的窗口需要重新查找最大值并设置
        if max == -1 || max == l-1 {
            max = getMax(nums,l,r)
        }else{
        //如果出去的值不是最大值(的索引),则判断新进来的值是否大于当前的最大值
            //不大于则最大值(的索引)不变
            //大于则将进来的值(的索引)作为最大值(的索引)
            if nums[r] > nums[max] {
                max = r
            }
        }
        maxNums = append(maxNums,nums[max])
    }
    return maxNums
}

//双指针查找最大值的索引
func getMax(nums []int,left,right int) int {
    for left<right{
        if nums[left]>nums[right]{
            right--
        }else{
            left++
        }
    }
    return left
}

写法二:比较值本身

–执行用时:20 ms --内存消耗:6.4 MB

func maxSlidingWindow(nums []int, k int) []int {
    if len(nums) == 0 || k <= 0 || k > len(nums){
        return nil
    }
    var maxNums []int
    maxNow:=max(nums[0:k])
    maxNums=append(maxNums,maxNow)
    for i:=1;i<=len(nums)-k;i++{
        if nums[i-1]==maxNow{
            maxNow=max(nums[i:i+k])
            maxNums=append(maxNums,maxNow)
        }else{
            if nums[i+k-1]<=maxNow{
                maxNums=append(maxNums,maxNow)
            }else{
                maxNow=max(nums[i:i+k])
                maxNums=append(maxNums,maxNow)
            }
        }
    }
    return maxNums
}

func max(nums []int) int {
    left:=0
    right:=len(nums)-1
    for left<right{
        if nums[left]>nums[right]{
            right--
        }else{
            left++
        }
    }
    return nums[left]
}

解法二:暴力法

–执行用时:44 ms --内存消耗:6.4 MB

func maxSlidingWindow(nums []int, k int) []int {
    if len(nums) == 0 || k <= 0 || k > len(nums){
        return nil
    }
    var maxNums []int
    for i:=0;i<=len(nums)-k;i++{
        maxNums=append(maxNums,max(nums[i:i+k]))
    }
    return maxNums
}

func max(nums []int) int {
    left:=0
    right:=len(nums)-1
    for left<right{
        if nums[left]>nums[right]{
            right--
        }else{
            left++
        }
    }
    return nums[left]
}

在LeetCode该题中,我也有提交题解,欢迎查看。昵称:Sakura。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值