如何减少循环嵌套?三数之和Swift代码优化与高效编程思维
优化三数之和判断的Swift实现与高效代码思维培养
一、减少循环嵌套的具体方案:双指针法
原来的三重循环时间复杂度是O(n³),数据量一大就会很慢。我们可以用双指针法把复杂度降到O(n²),核心思路是借助有序数组的特性,用两个指针的移动替代内层两层循环:
- 先给数组排序,排序的时间是O(n log n),这步是后续优化的基础
- 遍历数组中的每个元素作为第一个数,然后用左指针指向它的下一个位置,右指针指向数组末尾
- 根据三个数的和与目标值的对比,移动指针:
- 和小于目标值:左指针右移,让总和变大
- 和大于目标值:右指针左移,让总和变小
- 和等于目标值:直接返回true,说明找到符合条件的三个数
Swift代码示例
func hasThreeSum(_ nums: [Int], target: Int) -> Bool { let sortedNums = nums.sorted() let count = sortedNums.count for i in 0..<count - 2 { // 跳过重复元素,避免重复计算(可选但实用的优化) if i > 0 && sortedNums[i] == sortedNums[i-1] { continue } var left = i + 1 var right = count - 1 while left < right { let currentSum = sortedNums[i] + sortedNums[left] + sortedNums[right] if currentSum == target { return true } else if currentSum < target { left += 1 // 跳过重复的左指针元素,减少无效遍历 while left < right && sortedNums[left] == sortedNums[left-1] { left += 1 } } else { right -= 1 // 跳过重复的右指针元素 while left < right && sortedNums[right] == sortedNums[right+1] { right -= 1 } } } } return false }
二、培养高效代码思维的几个实用方法
1. 先算复杂度,再想优化方向
写代码前先估算暴力解法的复杂度,比如三重循环O(n³),明显可以优化。然后思考有没有更低复杂度的思路——比如用空间换时间(比如哈希表存已遍历元素),或者利用排序+双指针这类算法技巧。
2. 吃透经典问题的解法
像两数之和、三数之和、滑动窗口这类经典问题,它们的解法是很多复杂问题的基础。比如三数之和本质就是“固定一个数,找两数之和等于目标差值”,把复杂问题拆解成熟悉的小问题,就能快速找到优化方向。
3. 别忽略边界和重复场景
数组里的重复元素、空数组、目标值超出数组元素范围这些场景,不仅要处理,还能用来优化——比如上面代码里跳过重复元素,能减少很多不必要的循环,提升实际运行效率。
4. 多对比不同解法,复盘总结
写完代码后,看看有没有其他实现方式,比如用哈希表实现三数之和的另一种思路,对比双指针和哈希表的时间、空间差异,总结哪种场景下用哪种方法更合适。
5. 选对数据结构
合适的数据结构能直接降低复杂度:比如哈希表可以把查找从O(n)降到O(1),有序数组能让双指针操作成为可能。写代码前先想清楚,当前问题需要快速查找?还是需要有序遍历?再选对应的结构。
内容的提问来源于stack exchange,提问作者nitpaxy
相关产品推荐
相关产品推荐

