算法与数据结构:高频题型图解
算法题刷题不在多,在把「套路」吃透。下面三道是面试高频题,覆盖哈希、双指针、二分三大核心思想。
一、复杂度先搞清楚
O(n) 表示随数据量线性增长。能用一次遍历 + 哈希表解决的,就别用两层循环(O(n²))。判断复杂度是选算法的第一直觉。
二、两数之和(哈希表)
题目:给定数组和目标值,返回和为目标的两个下标。暴力法是双重循环,用哈希表把「见过的数 → 下标」存起来,一次遍历即可:
def two_sum(nums, target):
seen = {}
for i, x in enumerate(nums):
if target - x in seen:
return [seen[target - x], i]
seen[x] = i
return [] # 时间 O(n),空间 O(n)
三、反转链表(双指针)
用 prev 和 cur 两个指针,边遍历边把指向调头:
def reverse(head):
prev, cur = None, head
while cur:
nxt = cur.next
cur.next = prev
prev, cur = cur, nxt
return prev
四、二分查找
有序数组里找目标,每次砍掉一半,时间复杂度 O(log n)。注意边界:left <= right 和 mid 的更新。
def search(a, target):
left, right = 0, len(a) - 1
while left <= right:
mid = (left + right) // 2
if a[mid] == target: return mid
if a[mid] < target: left = mid + 1
else: right = mid - 1
return -1
五、刷题建议
- 按题型刷,而不是按编号刷——把一类套路练熟;
- 先手写,再跑用例,最后看题解对比更优解法;
- 定期复盘错题,比盲目冲数量有用。
提醒:算法是手段不是目的。理解思想、能讲清「为什么这样更快」,比背下某题代码更重要。