给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。

返回滑动窗口最大值

  1. 输入: nums = [,,-,-,,,,], k =
  2. 输出: [,,,,,]
  3. 解释:
  4.  
  5. 滑动窗口的位置 最大值
  6. --------------- -----
  7. [ -] -
  8. [ - -]
  9. [- - ]
  10. - [- ]
  11. - - [ ]
  12. - - [ ]

其实这道题就是求给定数组中获取全部K个连续元素中最大值的集合

首先我们可能会遇到三中情况

  • 当原始数组为空的,那就直接返回一个空数组
  • 如果原始数组的长度与给定的k是一样的,那么就直接去原始数组的最大值即可
  • 如果原始数组的长度大于K,那么我们就要求每个连续子数组的最大值了
对于第一种情况就非常简单了
  1. var result []int
  2. //如果切片长度为0的话,那就直接返回空切片
  3. if len(nums) == {
  4. return result
  5. }

对于第二种情况:

  1. //如果切片长度与k一样
  2. if len(nums) == k {
  3. result = append(result, getMax(nums))
  4. return result
  5. }

对于第三种情况:

  1. var windowSlice []int
  2. index :=
  3. for i := k; i <= len(nums); i++ {
  4. windowSlice = nums[index:i]
  5. result = append(result, getMax(windowSlice))
  6. index++
  7. }
  8. return result

这里每次都获取连续K个元素进行比较

全部代码:
  1. package main
  2.  
  3. import "fmt"
  4.  
  5. func maxSlidingWindow(nums []int, k int) []int {
  6. var result []int
  7. //如果切片长度为0的话,那就直接返回空切片
  8. if len(nums) == {
  9. return result
  10. }
  11. //如果切片长度与k一样
  12. if len(nums) == k {
  13. result = append(result, getMax(nums))
  14. return result
  15. }
  16.  
  17. var windowSlice []int
  18. index :=
  19. for i := k; i <= len(nums); i++ {
  20. windowSlice = nums[index:i]
  21. result = append(result, getMax(windowSlice))
  22. index++
  23. }
  24. return result
  25. }
  26.  
  27. func getMax(windowSlice []int) int {
  28. max := windowSlice[]
  29. for i := ; i < len(windowSlice); i++ {
  30. if windowSlice[i] >= max {
  31. max = windowSlice[i]
  32. }
  33. }
  34. return max
  35. }
  36.  
  37. func main() {
  38. nums := []int{, , -, -, , , , }
  39. fmt.Println(maxSlidingWindow(nums, ))
  40. // nums := []int{}
  41. // fmt.Println(maxSlidingWindow(nums, 0))
  42. // nums := []int{1, -1}
  43. // fmt.Println(maxSlidingWindow(nums, 1))
  44. }

附上老师的解法,但是我看不懂!

  1. func maxSlidingWindow(nums []int, k int) []int {
  2. result := []int{}
  3. if len(nums) == {
  4. return result
  5. }
  6.  
  7. window := []int{}
  8. for i, x := range nums {
  9. if i >= k && window[] <= i-k {
  10. window = window[:]
  11. }
  12. for len(window) != && nums[window[len(window)-]] <= x {
  13. window = []int{}
  14. }
  15. window = append(window, i)
  16. if i >= k- {
  17. result = append(result, nums[window[]])
  18. }
  19. }
  20. return result
  21. }

滑动窗口最大值的golang实现的更多相关文章

  1. [Swift]LeetCode239. 滑动窗口最大值 | Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  2. [Leetcode]双项队列解决滑动窗口最大值难题

    这道题是从优先队列的难题里面找到的一个题目.可是解法并不是优先队列,而是双项队列deque 其实只要知道思路,这一道题直接写没有太大的问题.我们看看题 给定一个数组 nums,有一个大小为 k 的滑动 ...

  3. Q239 滑动窗口最大值

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: 输入: nums ...

  4. Leetcode 239.滑动窗口最大值

    滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: ...

  5. Java实现 LeetCode 239 滑动窗口最大值

    239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...

  6. LeetCoded第239题题解--滑动窗口最大值

    滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 进 ...

  7. 代码随想录第十三天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素

    第一题150. 逆波兰表达式求值 根据 逆波兰表示法,求表达式的值. 有效的算符包括 +.-.*./ .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 注意 两个整数之间的除法只保留整数部分. ...

  8. [LeetCode] Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  9. [leetcode]239. Sliding Window Maximum滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

随机推荐

  1. angularJS学习(二)

    1.实现列表 思路: accessCtrl.js let AccessCtrl = function($scope, AlertService, DialogService, BigDataServi ...

  2. Android app 架构的一些讨论和资源收藏

    架构 https://www.zhihu.com/question/21406685 MVP,MVC,MVVM框架 http://blog.csdn.net/copy_yuan/article/det ...

  3. python操作符笔记

    1.**两个乘号就是乘方,比如2**4,结果就是2的4次方,结果是16 2.//就是做浮点除法,并舍弃小数部分(注意不是四舍五入) 3.@是python中的修饰符,具体功能我没弄懂.

  4. 自定义微信小程序导航(兼容各种手机)

    详细代码请见github,请点击地址,其中有原生小程序的实现,也有wepy版本的实现 了解小程序默认导航 如上图所示,微信导航分为两部分,第一个部分为statusBarHeight,刘海屏手机(iPh ...

  5. leetcode — pascals-triangle-ii

    import java.util.Arrays; /** * * Source : https://oj.leetcode.com/problems/pascals-triangle-ii/ * * ...

  6. 流式大数据计算实践(5)----HBase使用&SpringBoot集成

    一.前言 1.上文中我们搭建好了一套HBase集群环境,这一文我们学习一下HBase的基本操作和客户端API的使用 二.shell操作 先通过命令进入HBase的命令行操作 /work/soft/hb ...

  7. 【Node.js】一、搭建基于Express框架运行环境+更换HTML视图引擎

      1)安装express generator生成器 这个express generator生成器类似于vue-cli脚手架工具,用来创建一个后端项目,首先我们要对生成器进行全局安装,在cmd中输入下 ...

  8. Django 系列博客(十二)

    Django 系列博客(十二) 前言 本篇博客继续介绍 Django 中的查询,分别为聚合查询和分组查询,以及 F 和 Q 查询. 聚合查询 语法:aggregate(*args, **kwargs) ...

  9. SpringCloud学习(二):微服务入门实战项目搭建

    一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ...

  10. [JavaScript] audio在浏览器中自动播放

    audio 在浏览器中自动播放 autoplay 属性 autoplay 属性规定一旦音频就绪马上开始播放. 如果设置了该属性,音频将自动播放. 使用 autoplay 属性进行播放 //使用auto ...