名企算法题目总结(2)
5.栈实现另外一个栈排序
分析: 插入排序
6.滑动窗口每步中,最大的元素值
0 1 2 3 4 5 6 7
4 3 5 4 3 3 10 12 假设窗口大小w=3,则结果为5,5,5,4,10,12
分析: 给定一个结构,每次添加一个元素,删除一个元素,求结构中最大值?
如果这个结构是一个大顶堆,需要知道删除节点的堆index,可以用一个hash映射实现,调整堆时间复杂度为log(w);最终时间复杂度为N*log(w)
分析2:本题,删除元素有规则可循,相当于一个约束条件
结构使用一个队列,队头为当前最大值的index,每次滑动删除元素,判断是否出队头,添加元素,判断该值能在队列中排第几位(此时添加的元素生存期肯定大于前面的元素,前面比他小的都可以删除了).
因此队列结构变化为:0->01->2->23->234->35->6->7
7. 窗口能框出来的最大值,框中的高以框中的数中最小的计算,宽就是index范围
3 4 5 4 3 6 能框出来 3*6=18,为最大
划出 R2控件高度变化折线,定义结算时刻为下降的时候,结算到 下降的最低高度
需要用栈模拟,时间复杂度O(n) 控件O(n)
8.子窗口集中最大值减去最小值小于num的子窗口个数
3 4 5 5 6 5 2
算法1: 给定 [i,j]窗口计算最大值与最小值(数组中所有窗口的最大最小值)
时间复杂度O(n)
滑动窗口,用某结构记录[i,j](双端队列,一头大,一头小),i,j变化时候,更新队列
算法2: 若[i,j]不满足,那么包含[i,j]的所有窗口都不满足
若[i,j]不满足,那么必然存在一个[i+d,j]的窗口满足
融合算法1与算法2可以解决问题