每日算法 -【Swift 算法】三数之和最接近目标值
🚀 Swift 实现:三数之和最接近目标值(3Sum Closest)
✨ 前言
在算法学习过程中,经典的“三数之和”系列题目是很多人通往进阶路上的一道坎。今天我们来介绍其中一个非常实用的变种问题 —— 三数之和最接近目标值(3Sum Closest),并使用 Swift 实现一个高效的解法。
📌 问题描述
给定一个包含 n
个整数的数组 nums
和一个目标值 target
,请从数组中找出 三个整数,使得它们的和最接近 target
,返回这个最接近的和。
假设每组输入只存在唯一解。
示例:
输入: nums = [-1, 2, 1, -4], target = 1
输出: 2
解释: 最接近目标值 1 的和是 2(-1 + 2 + 1 = 2)
🔍 解题思路
我们使用经典的 排序 + 双指针 思路,整体时间复杂度为 O(n^2)
:
- 先对数组进行排序,以便后续使用双指针。
- 从左到右遍历数组,固定一个数
nums[i]
。 - 使用两个指针
left = i + 1
,right = n - 1
,在剩余的区间中找出两个数,使得三个数之和最接近目标值。 - 用一个变量
closestSum
来持续更新当前找到的最接近的和。 - 如果三数之和正好等于目标值,直接返回即可。
🧠 边界注意
- 为防止数组越界,我们确保数组长度至少为 3。
- 使用
abs(currentSum - target)
与当前最优解进行比较,更新最接近的和。
✅ Swift 实现代码
func threeSumClosest(_ nums: [Int], _ target: Int) -> Int {guard nums.count >= 3 else {fatalError("数组长度必须至少为 3")}let nums = nums.sorted()let n = nums.countvar closestSum = nums[0] + nums[1] + nums[2]for i in 0..<n - 2 {var left = i + 1var right = n - 1while left < right {let currentSum = nums[i] + nums[left] + nums[right]if abs(currentSum - target) < abs(closestSum - target) {closestSum = currentSum}if currentSum < target {left += 1} else if currentSum > target {right -= 1} else {return target // 最优解,直接返回}}}return closestSum
}
🧪 示例测试
let nums = [-1, 2, 1, -4]
let target = 1
let result = threeSumClosest(nums, target)
print("最接近的三数之和为:\(result)")
// 输出:最接近的三数之和为:2
📈 时间与空间复杂度分析
- 时间复杂度:
O(n^2)
,排序是O(nlogn)
,双指针循环是O(n^2)
。 - 空间复杂度:
O(1)
,使用了常数额外空间。
🧵 小结
本题不仅锻炼了我们处理数组问题的能力,也考察了我们在排序基础上的双指针技巧。Swift 在处理这类算法问题时,同样可以非常清晰简洁地实现逻辑。
如果你正在准备算法面试,这类“固定一个数 + 双指针”的套路一定要熟练掌握!
💬 欢迎交流
如果你觉得这篇文章对你有帮助,不妨点个赞、收藏或留言交流更多 Swift 算法题目,感谢你的阅读 🙌!