小码哥《恋上数据结构与算法第三季》笔记(三):头条、美团、滴滴等面试题03

914 阅读2分钟

我的Github地址

小码哥《恋上数据结构与算法》笔记

极客时间《iOS开发高手课》笔记

iOS大厂面试高频算法题总结

iOS面试资料汇总

第一题:155. 最小栈

一、题目描述

二、思路

  • 创建两个栈,一个正常栈(存放数据),一个最小栈(存放最小值)
  • 每次往正常栈存放数据时,同时向最小栈中存入一个最小值
  • 当从正常栈pop数据时候,最小栈pop出的数据代表正常栈中的最小值。

三、代码实现

四、类似题目

面试题 03.02. 栈的最小值

第二题:239. 滑动窗口最大值

一、题目描述

二、思路

  • 使用双端队列的思想。
  • 滑动窗口的宽度为3,那么产生的最大值总数应该是5个。
  • i指针用来扫描元素,代表滑动窗口最后一个元素指针。
  • 如果nums[i] >= 队尾,不断删除队尾,直到队尾 > nums[i]为止。
  • 队尾 > nums[i],将nums[i]插入队尾。
  • 检查队头是否过期过期移除
  • 设置w窗口的最大值为nums[队头]

三、实操

  • 准备一个双端队列,内部存放的是索引。队列中的元素从头到尾对应的元素值是逐渐减小的。
  • 移动双端队列,将满足条件的值放入队列中。
  • w指针合法(有值)的时候,窗口的最大值即为双端队列头部7
  • 再次滑动滑动窗口,要保证双端队列中的索引是否过期。即是否在wi指针之间。窗口的最大值仍然为双端队列头部7
  • 滑动滑动窗口,将-3插入队列尾部,头部索引1过期,所以移除,窗口最大值5
  • 滑动滑动窗口-1大于-3,则用-1更换-3,并且移除过期头部所以5窗口最大值3
  • 滑动滑动窗口8大于3-1,将3-1从队列中移除,然后将8放入队列,窗口最大值8
  • 滑动滑动窗口2小于8,直接插入双端队列尾部,窗口最大值8

三、代码实现

  • 时间复杂度O(n)

四、类似题目

面试题59 - I. 滑动窗口的最大值