📝 面试准备 - 算法篇 🌀

记录为面试准备的算法相关内容。

数据结构

基础

常见数据结构

数组

最基础的数据结构。

常考点:

  • 找数组中第k大的数字
  • 找两个有序数组的中位数

Question:
Leetcode 1: Two Sum 两数之和 [简单] Leetcode 243: Shortest Word Distance 最短单词距离 [简单]

链表

常考点:

  • 反转链表
  • 链表元素排序
  • 合并两个有序链表
  • 判断链表是否有环(有环的起始点)

队列

哈希表

二叉树

递归思想的数据结构。

常考点:

  • 判断二叉树是否平衡
  • 判断二叉树是否相同
  • 判断二叉树是否对称

算法

基础

时间复杂度 常用:大O表示法。

空间复杂度

常见算法思想

  • 分治
  • 动态规划
  • 贪心
  • 回溯
  • 双指针

常用算法

排序

搜索

动态规划

贪心算法

回溯算法

分治算法

双指针 Two Pointers

双指针算法是一种通过维护两个索引(或指针)来解决问题的技术,这些指针通常从数组或字符串的两端开始,根据特定条件向中间移动。
这种方法在排序数组中寻找满足条件的元素对时特别有效,例如寻找和为目标值的两个数。

核心思想
通过维护两个索引(或指针)来高效地遍历数据结构,减少时间复杂度,通常达到 O(n)

分为:
标准双指针

适用于排序数组,指针从两端开始,根据元素和与目标值的比较移动。
例如,在“两数之和II-输入有序数组”(LeetCode #167)中,初始化一个指针在数组开头,另一个在结尾,调整指针直到找到目标和。

典型例题:

  • leetcode: 167. Two Sum II - Input Array Is Sorted
  • leetcode: 15. 3Sum
  • leetcode: 18. 4Sum
  • leetcode: 11. Container With Most Water
  • leetcode: 75. Sort Colors
  • leetcode: 283. Move Zeroes
  • leetcode: 26. Remove Duplicates from Sorted Array

复杂度:

  • 时间:O(n)
  • 空间:O(1)

滑动窗口

一种高级双指针变体,用于子数组或子串问题,通过两个指针定义一个窗口,扩展或收缩窗口以满足条件。
例如,“最长不含重复字符的子串”(LeetCode #3)使用滑动窗口找到最长无重复字符的子串。

典型例题:

  • leetcode: 3. Longest Substring Without Repeating Characters
  • leetcode: 76. Minimum Window Substring

复杂度:

  • 时间:O(n)
  • 空间:O(k),k为窗口内可能包含的唯一元素数

快慢指针

主要用于链表问题,如检测循环(Floyd 循环检测算法)。快指针每次移动两步,慢指针移动一步,若快指针到达空或相遇则无环,否则有环。
例如,“链表是否有环”(LeetCode #141)中,快指针每次移动两步,慢指针移动一步,如果有环它们会相遇。

典型例题:

  • leetcode: 141. Linked List Cycle
  • leetcode: 876. Middle of the Linked List

复杂度:

  • 时间:O(n)
  • 空间:O(1)

滑动窗口

二分法

DFS/BFS