【Swift 算法】Two Sum 问题:从暴力解法到最优解法的演进
本文通过"Two Sum"问题,带你了解如何从最直观的暴力解法,逐步优化到高效的哈希表解法,并对两者进行对比,适合算法入门和面试准备。
💡 问题描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。
不能使用同一个元素两次。
🪓 解法一:暴力枚举(Brute Force)
🧠 思路:
- 使用两层循环,枚举所有可能的两两组合。
- 判断它们的和是否等于
target
。 - 一旦找到即返回。
💻 代码实现:
swift
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)
:只用了常量空间。
✅ 示例:
swift
let nums = [2, 7, 11, 15]
let target = 9
print(twoSumBruteForce(nums, target)) // 输出: [0, 1]
⚡ 解法二:哈希表(最优解法)
🧠 思路:
- 用一个字典记录"元素值 ➜ 索引"。
- 遍历数组时,计算目标值与当前元素的差值
complement = target - num
。 - 判断这个差值是否已经出现在字典中,如果是,说明找到了。
💻 代码实现:
swift
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)
:用了一个哈希表来存储元素。
✅ 示例:
swift
let nums = [2, 7, 11, 15]
let target = 9
print(twoSum(nums, target)) // 输出: [0, 1]
📊 总结对比
解法 | 时间复杂度 | 空间复杂度 | 特点 |
---|---|---|---|
暴力解法 | O(n²) | O(1) | 简单易懂,适合初学者 |
哈希表解法 | O(n) | O(n) | 性能更高,适合大数据、面试场景 |