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

2,473 阅读2分钟

我的Github地址

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

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

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

iOS面试资料汇总

第一题:88. 合并两个有序数组

一、题目描述

二、思路

  • 此题涉及归并排序思想。
  • 搞两个指针,分别指向nums1nums2两个数组最后一个元素,即36。再拿一个指针指向nums1最后一个位置。
  • 拿出nums1nums2两个数组最后一个元素进行比较,将两者中较大值放在nums1最后一位指针处,并将该指针位置向前移动一位。并且较大值数组指针也向前移动一位
  • 循环以上步骤,直到nums2数组下标小于0,则排序完成。
  • nums1数组下标小于0,则只需要将nums2数组剩余值依次赋给nums1即完成排序。

三、代码实现

作者提示:小码哥的实现不严谨,如果num1的空间大于m+n,会导致错误。所以cur = m + n - 1

第二题:75. 颜色分类

一、题目描述

二、思路

  • 该题目进阶要求空间复杂度O(1),时间复杂度O(n)
  • 一般题目涉及扫描一遍即完成排序的,都会涉及双指针三指针
  • 该题需要准备三个指针紫色指针代表存放2绿色指针代表存放0红色指针代表遍历数组
  • 红色指针遍历时,遇到1则跳过,红色指针++,遇到0则跟绿色指针交换值,绿色指针++,红色指针++。
  • 遇到2,跟紫色指针交换位置,紫色指针--,再次对红色指针的值进行判断。
  • 红色指针的下标大于紫色指针,则退出排序。

三、代码实现

第三题:16.16.部分排序类

一、题目描述

二、思路

  • 该题目思路是寻找逆序对
  • 分别从左往右从右往左找到逆序对,这样即可确定范围。
  • 从左往右扫描,记录最大值,如果发现当前值小于最大值,则记录它的位置(有可能是逆序对最大范围),如果当前值大于最大值,则覆盖最大值
  • 从右往左扫描,记录最小值,如果发现当前值大于最小值,则记录它的位置(有可能是逆序对最大范围),如果当前值小于最小值,则覆盖最小值
  • 两次扫描记录的位置范围,就是需要排序的范围。

三、代码实现

精选面试题