您的位置:首页 > Web前端

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

2020-03-05 01:26 741 查看

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

  • 设置变量 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。

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    士多啤梨先生 发布了57 篇原创文章 · 获赞 0 · 访问量 950 私信 关注
  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: