经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
滑动窗口最大值的golang实现
来源:cnblogs  作者:timliudream  时间:2018/12/14 9:31:50  对本文有异议

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

返回滑动窗口最大值

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

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

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

  • 当原始数组为空的,那就直接返回一个空数组
  • 如果原始数组的长度与给定的k是一样的,那么就直接去原始数组的最大值即可
  • 如果原始数组的长度大于K,那么我们就要求每个连续子数组的最大值了
对于第一种情况就非常简单了
  1. var result []int
  2. //如果切片长度为0的话,那就直接返回空切片
  3. if len(nums) == 0 {
  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 := 0
  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. import "fmt"
  3. func maxSlidingWindow(nums []int, k int) []int {
  4. var result []int
  5. //如果切片长度为0的话,那就直接返回空切片
  6. if len(nums) == 0 {
  7. return result
  8. }
  9. //如果切片长度与k一样
  10. if len(nums) == k {
  11. result = append(result, getMax(nums))
  12. return result
  13. }
  14. var windowSlice []int
  15. index := 0
  16. for i := k; i <= len(nums); i++ {
  17. windowSlice = nums[index:i]
  18. result = append(result, getMax(windowSlice))
  19. index++
  20. }
  21. return result
  22. }
  23. func getMax(windowSlice []int) int {
  24. max := windowSlice[0]
  25. for i := 0; i < len(windowSlice); i++ {
  26. if windowSlice[i] >= max {
  27. max = windowSlice[i]
  28. }
  29. }
  30. return max
  31. }
  32. func main() {
  33. nums := []int{1, 3, -1, -3, 5, 3, 6, 7}
  34. fmt.Println(maxSlidingWindow(nums, 3))
  35. // nums := []int{}
  36. // fmt.Println(maxSlidingWindow(nums, 0))
  37. // nums := []int{1, -1}
  38. // fmt.Println(maxSlidingWindow(nums, 1))
  39. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号