解决任何编码面试问题的 14 种模式

192 阅读4分钟

背景

在这里,我列出了可用于解决任何编码面试问题的前 14 种模式,以及如何识别每种模式,以及每种模式的一些示例问题。

1. 滑动窗口

滑动窗口模式用于对给定数组或链表的特定窗口大小执行所需的操作,例如查找包含全 1 的最长子数组。滑动窗口从第一个元素开始,并保持向右移动一个元素,并根据您要解决的问题调整窗口的长度。在某些情况下,窗口大小保持不变,而在其他情况下,大小会增加或缩小。

image.png

以下是一些可以识别给定问题可能需要滑动窗口的方法:

  • 问题输入是线性数据结构,例如链表、数组或字符串
  • 要求您找到最长/最短的子字符串、子数组或所需的值

使用滑动窗口模式的常见问题:

  • Maximum sum subarray of size ‘K’ (easy)
  • Longest substring with ‘K’ distinct characters (medium)
  • String anagrams (hard)

2. 两个指针或迭代器

双指针是一种模式,其中两个指针串联遍历数据结构,直到其中一个或两个指针达到特定条件。在排序数组或链表中搜索对时,双指针通常很有用;例如,当您必须将数组的每个元素与其其他元素进行比较时。

需要两个指针,因为只有指针,您必须不断地循环返回数组才能找到答案。这种使用单个迭代器的来回操作对于时间和空间复杂性(称为渐近分析的概念)效率低下。虽然带有 1 个指针的蛮力或幼稚的解决方案会起作用,但它会产生类似于 O(n²) 的东西。在许多情况下,两个指针可以帮助您找到具有更好空间或运行时复杂性的解决方案。

image.png

确定何时使用双指针方法的方法:

  • 它将在您处理排序数组(或链接列表)并需要找到一组满足某些约束的元素时出现问题
  • 数组中的元素集合是一对、一个三元组,甚至是一个子数组

以下是两个指针模式的一些问题:

  • Squaring a sorted array (easy)
  • Triplets that sum to zero (medium)
  • Comparing strings that contain backspaces (medium)

3. 快慢指针

快速和慢速指针方法,也称为 Hare & Tortoise 算法,是一种指针算法,它使用两个指针以不同的速度在数组(或序列/链表)中移动。这种方法在处理循环链表或数组时非常有用。

通过以不同的速度移动(例如,在循环链表中),该算法证明两个指针必然会相遇。一旦两个指针都处于循环循环中,快速指针应该捕获慢速指针。

image.png

如何确定何时使用“快”和“慢”模式?

  • 该问题将处理链表或数组中的循环
  • 当您需要知道某个元素的位置或链表的总长度时。

我什么时候应该在上面提到的两指针方法上使用它?

在某些情况下,您不应该使用双指针方法,例如在无法向后移动的单链表中。何时使用 Fast and Slow 模式的一个示例是当您尝试确定链表是否为回文时。

快速和慢速指针模式的问题:

  • Linked List Cycle (easy)
  • Palindrome Linked List (medium)
  • Cycle in a Circular Array (hard)

4. 合并区间

合并区间模式是一种处理重叠间隔的有效技术。在许多涉及区间的问题中,要么需要找到重叠的区间,要么如果它们重叠则合并区间。该模式的工作原理如下:

给定两个区间(“a”和“b”),这两个区间可以通过六种不同的方式相互关联:

image.png

了解和认识这六种情况将帮助解决从插入区间到优化区间合并的广泛问题。

如何确定何时使用合并间隔模式?

如果被要求生成一个只有互斥区间的列表
如果听到“重叠间隔”一词。
合并区间问题模式:
 区间交点(中)
 最大 CPU 负载(硬)

5.循环排序

此模式描述了一种有趣的方法来处理涉及包含给定范围内的数字的数组的问题。循环排序模式一次迭代一个数字,如果您正在迭代的当前数字不在正确的索引处,则将其与正确索引处的数字交换。您可以尝试将数字放在正确的索引中,但这会产生 O(n^2) 的复杂度,这不是最优的,因此是循环排序模式。

image.png

我如何识别这种模式?

它们将是涉及数字在给定范围内的排序数组的问题 如果问题要求您在排序/旋转数组中查找丢失/重复/最小的数字

循环排序模式的问题:

1 找到丢失的号码(简单) 2 找到最小的缺失正数(中)