第十三天 栈和队列part03
LC239滑动窗口最大值(未掌握)
- 暴力解法:使用大根堆,每次加入一个end数据删除一个start数据,随后start++,end++,但是会超时
- 代码
- 使用单调队列:
- 队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。
- 滑动窗口最大值:单调队列的队头值
- 可能成为窗口中的最大值(主要解决如何弹出元素的问题,原本的解决方案中往往会超时):
- 入队元素大于队尾元素,队尾元素出队直到队尾元素小于等于入队元素,否则入队元素队尾入队
- 移除元素:只有当移除的元素等于队头元素才移除元素
- 注意:未指定queue的类型的时候默认使用Deque
- 队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。
- 代码
LC347前K个高频元素(超时10min)
- 思路:利用HashMap统计词频,利用Set获取key和PriorityQueue构建大根堆根据词频排序
- PriorityQueue的构建不是很熟练:new Comparator<>(){public int compare(){}}
- 获取HashMap的key集:Set set = map.keySet()
- 代码:
栈和队列的总结
- 面试题:栈里面的元素在内存中是连续分布的吗
- 栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
- 栈,队列不归类为容器,往往被归类为容器适配器。栈的底层实现可以是 vector,deque,list 都可以,主要就是数组和链表的底层实现。
- 缺省情况下,默认底层容器是deque,deque在内存中的数据分布是不连续的
- 栈是容器适配器,底层容器使用不同的容器,导致栈内数据在内存中不一定是连续分布的。
- 经典未掌握题目
- 用队列实现栈:一个栈用来存放元素,一个元素用来备份元素
- 括号匹配:使用一个栈的简洁写法,遇见左括号直接入栈右括号,遇见右括号直接出栈对应右括号
- 中缀后缀表达式求值