sofard

导航

名企算法题目总结(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可以解决问题

   

 

 

 

 

 

 

 

 

  

posted on 2018-11-07 18:00  sofard  阅读(77)  评论(0编辑  收藏  举报