算法题报错「Time Limit Exceeded」:从暴力解法到空间换时间的优化路径
在算法编程中,Time Limit Exceeded
(TLE)错误是每位开发者都会遇到的挑战。本文将通过典型案例,展示从暴力解法到空间换时间的完整优化路径,并提供可复用的优化策略。
一、暴力解法:理解问题与初步尝试
示例问题:两数之和(LeetCode 1)
问题描述:给定一个整数数组nums
和一个目标值target
,找出数组中两个数的和等于目标值,并返回它们的下标。
暴力解法代码(O(n²))
def two_sum_brute_force(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]
return []
复杂度分析:
- 时间复杂度:O(n²) - 双重循环遍历所有元素对
- 空间复杂度:O(1) - 仅使用常数额外空间
典型TLE场景:
- 数组长度n=10⁴时,操作次数约5×10⁷次
- 数组长度n=10⁵时,操作次数约5×10⁹次(必然超时)
二、哈希表优化:空间换时间的经典实践
优化思路:
- 存储已遍历元素的值与索引,将查找时间从O(n)降至O(1)
- 空间复杂度从O(1)升至O(n),但时间复杂度降至O(n)
哈希表解法代码(O(n))
def two_sum_hash_map(nums, target):
num_map = {
}
for i, num in enumerate(nums):
complement = target - num
if complement in num_map:
return