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
}
目录
相关文章
|
22天前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
4天前
|
算法 搜索推荐
力扣每日一题 6/15 滑动窗口
力扣每日一题 6/15 滑动窗口
5 1
|
19天前
|
算法
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
【LeetCode刷题】滑动窗口解决问题:串联所有单词的子串(困难)、最小覆盖子串(困难)
|
19天前
|
算法 容器
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
【LeetCode刷题】滑动窗口解决问题:水果成篮、找到字符串中所有字母异位词
|
4天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
10 0
|
19天前
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
【LeetCode刷题】滑动窗口思想解决:最大连续1的个数 III、将x减到0的最小操作数
|
19天前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
19天前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
22天前
|
存储 算法 数据可视化
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
深入解析力扣159题:至多包含两个不同字符的最长子串(滑动窗口法详细图解)
|
22天前
|
算法 数据可视化 数据挖掘
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134
最佳加油站选择算法:解决环路加油问题的两种高效方法|LeetCode力扣134