golang力扣leetcode 239.滑动窗口最大值

简介: golang力扣leetcode 239.滑动窗口最大值

239.滑动窗口最大值

239.滑动窗口最大值

题解

题目:给一个数组,再给一个k大小的滑动窗口,求窗口内的最大值

思路:优先队列 和 单调栈

1.维护一个单调递减队列
2.对于窗口右移,就是往队列中插入,与删除
3.而删除需要遍历,但是本题其实不急着删除,即延迟删除
4.也就是说当nums[i-k] == queue[0]的时候,就可以删除,这样就是O(1)
5.对于插入,需要维护递减,如果插入v大于下面的,则弹出下面的即可
例如:[5,6,1,2]3  -->[6,1] ans0=6 -->[6,2] ans1=6
例如:[6,5,1,2]3  -->[6,5,1]ans0=6 -->   nums[i-k] == queue[0]--->[5,2]ans1=2

代码

type PriorityQueue struct {
  queue []int
}
func (pq *PriorityQueue) Push(v int) {
  for !pq.IsEmpty() && v > pq.Back() {
    pq.queue = pq.queue[:len(pq.queue)-1]
  }
  pq.queue = append(pq.queue, v)
}
func (pq *PriorityQueue) Pop(v int) {
  if pq.Front() == v {
    pq.queue = pq.queue[1:]
  }
}
func (pq *PriorityQueue) Front() int {
  return pq.queue[0]
}
func (pq *PriorityQueue) Back() int {
  return pq.queue[len(pq.queue)-1]
}
func (pq *PriorityQueue) IsEmpty() bool {
  return len(pq.queue) == 0
}
func maxSlidingWindow(nums []int, k int) []int {
  pq := PriorityQueue{queue: make([]int, 0)}
  ans := make([]int, 0)
  for i := 0; i < k; i++ {
    pq.Push(nums[i])
  }
  ans = append(ans, pq.Front())
  for i := k; i < len(nums); i++ {
    pq.Pop(nums[i-k])
    pq.Push(nums[i])
    ans = append(ans, pq.Front())
  }
  return ans
}
func maxSlidingWindow(nums []int, k int) []int {
  stack := make([]int, 0)
  var push func(v int)
  push = func(v int) {
    for len(stack) >= 0 && v > stack[len(stack)-1] {
      stack = stack[:len(stack)-1]
    }
    stack = append(stack, v)
  }
  ans := make([]int, 0)
  for i := 0; i < k; i++ {
    push(nums[i])
  }
  ans = append(ans, stack[0])
  for i := k; i < len(nums); i++ {
    push(nums[i])
    if nums[i-k] == stack[0] {
      stack = stack[1:]
    }
    ans = append(ans, stack[0])
  }
  return ans
}
目录
相关文章
|
3月前
【LeetCode 26】239.滑动窗口最大值
【LeetCode 26】239.滑动窗口最大值
45 1
|
3月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
3月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
112 0
|
3月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
36 0
|
3月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
70 0
|
3月前
【LeetCode 04】滑动窗口法总结
【LeetCode 04】滑动窗口法总结
33 0
|
5月前
|
存储 Python
【Leetcode刷题Python】239. 滑动窗口最大值
文章介绍了两种解决LeetCode上"滑动窗口最大值"问题的方法:使用大堆树和双向递减队列,提供了详细的解析和Python代码实现。
46 0
|
6月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
|
6月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
49 0
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行