本文通过“Two Sum”问题,带你了解如何从最直观的暴力解法,逐步优化到高效的哈希表解法,并对两者进行对比,适合算法入门和面试准备。
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。
不能使用同一个元素两次。
target
。func twoSumBruteForce(_ nums: [Int], _ target: Int) -> [Int] {
for i in 0..<nums.count {
for j in i + 1..<nums.count {
if nums[i] + nums[j] == target {
return [i, j]
}
}
}
return []
}
O(n²)
:两层循环遍历所有组合。O(1)
:只用了常量空间。let nums = [2, 7, 11, 15]
let target = 9
print(twoSumBruteForce(nums, target)) // 输出: [0, 1]
complement = target - num
。func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
var numToIndex = [Int: Int]()
for (index, num) in nums.enumerated() {
let complement = target - num
if let complementIndex = numToIndex[complement] {
return [complementIndex, index]
}
numToIndex[num] = index
}
return []
}
O(n)
:只遍历一遍数组,每次查找/插入都是常数时间。O(n)
:用了一个哈希表来存储元素。let nums = [2, 7, 11, 15]
let target = 9
print(twoSum(nums, target)) // 输出: [0, 1]
解法 | 时间复杂度 | 空间复杂度 | 特点 |
---|---|---|---|
暴力解法 | O(n²) | O(1) | 简单易懂,适合初学者 |
哈希表解法 | O(n) | O(n) | 性能更高,适合大数据、面试场景 |