在程序员的技术成长道路上,算法能力始终是衡量基本功的重要标尺。今天我想分享四道高频出现的LeetCode题目解法与思考过程,这些题目覆盖了哈希表、双指针、数组处理等常见考点,都是面试中的"常客"。无论你是准备技术面试还是想系统提升算法思维,这些案例都能提供直接的参考价值。
给定一个整数数组nums和一个目标值target,要求在数组中找出和为目标值的两个整数,并返回它们的下标。最简单的暴力解法是双重循环遍历所有可能的组合:
python复制def twoSum(nums, target):
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
这种解法时间复杂度为O(n²),在数据量较大时性能明显不足。面试中仅提出这种解法通常无法让面试官满意。
更优的解法是利用哈希表(字典)存储已遍历元素的值和索引,将查找时间从O(n)降到O(1):
python复制def twoSum(nums, target):
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return [hashmap[complement], i]
hashmap[num] = i
这个算法的时间复杂度降为O(n),空间复杂度为O(n)。在实际编码时需要注意:
字母异位词指字母相同但排列不同的单词,如"eat"、"tea"、"ate"。题目要求将一组字符串按异位词分组。关键在于找到统一的标识来表示一组异位词。
最直观的方法是将每个字符串排序后作为字典的键:
python复制def groupAnagrams(strs):
from collections import defaultdict
ans = defaultdict(list)
for s in strs:
key = tuple(sorted(s))
ans[key].append(s)
return list(ans.values())
时间复杂度:O(n*klogk),其中n是字符串数量,k是字符串最大长度
对于字符集较小的情况(如仅小写字母),可以用字符计数作为键:
python复制def groupAnagrams(strs):
from collections import defaultdict
ans = defaultdict(list)
for s in strs:
count = [0] * 26
for c in s:
count[ord(c) - ord('a')] += 1
ans[tuple(count)].append(s)
return list(ans.values())
时间复杂度:O(n*k),在k较大时优于排序法
提示:面试中可以先提出排序法,再优化为计数法,展示思考过程
给定未排序的整数数组,找出数字连续的最长序列长度。要求算法时间复杂度为O(n)。例如[100,4,200,1,3,2]的最长连续序列是[1,2,3,4],长度为4。
使用哈希集合存储所有数字,然后只从序列的起始点开始计算:
python复制def longestConsecutive(nums):
num_set = set(nums)
max_length = 0
for num in num_set:
if num - 1 not in num_set: # 确保是序列起点
current_num = num
current_length = 1
while current_num + 1 in num_set:
current_num += 1
current_length += 1
max_length = max(max_length, current_length)
return max_length
这个算法虽然看似有嵌套循环,但每个数字最多被访问两次(作为序列起点和中间节点),因此整体时间复杂度确实是O(n)。
给定一个数组nums,将所有0移动到数组末尾,同时保持非零元素的相对顺序。必须在原数组上操作,不能拷贝额外的数组。
使用快慢指针可以高效完成这个任务:
python复制def moveZeroes(nums):
slow = 0
for fast in range(len(nums)):
if nums[fast] != 0:
nums[slow], nums[fast] = nums[fast], nums[slow]
slow += 1
算法步骤解析:
时间复杂度O(n),空间复杂度O(1),完全符合题目要求。
类似的双指针技巧还可以解决:
针对每个问题,应该设计以下测试用例:
这四道题目虽然表面不同,但核心都考察了数据结构的选择能力。在实际面试中,面试官更看重:
建议的刷题方法:
对于算法学习,我的个人经验是:与其追求刷题数量,不如深入理解每道题目背后的算法思想。真正掌握哈希表、双指针这些核心技巧后,面对新题目时就能更快找到解题方向。