剑指 - 数组中和为0的3个数字(Swift)

61 阅读1分钟

题目

题目:输入一个数组,如何找出数组中所有和为0的3个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组[-1,0,1,2,-1,-4]中有两个三元组的和为0,它们分别是[-1,0,1]和[-1,-1,2]。

解题思路

  • 异常情况:数组的长度小于 3,直接返回。
  • 先对数组进行排序
  • 外部循环遍历 numbers ,内部循环获取与 numbers[i] 值和为 0 的 j,和k的值, 初始值:j = i + 1, k = numbers.count -1。
  • 外部循环的条件:i < numbers.count - 2;内部循环的遍历条件:j < k
  • 外部循环要跳过与 i 值相同的索引,循环条件: while i < sortednums.count && same == sortednums[i];内部循环要跳过与 j 值相同的索引,循环条件: while same == sortednums[j] && j < k

代码实现

class SumIsZero {
    static func threeSum(_ nums: [Int]) -> [[Int]] {
        if nums.count < 3 {
            return []
        }
        let sortednums = nums.sorted()
        
        var result: [[Int]] = []
        var i = 0
        while i < nums.count - 2 {
            var j = i + 1
            var k = nums.count - 1
            while j < k {
                let sum = sortednums[i] + sortednums[j] + sortednums[k]
                if sum == 0 {
                    result.append([sortednums[i], sortednums[j], sortednums[k]])
                    let same = sortednums[j]
                    while same == sortednums[j] && j < k {
                        j += 1
                    }
                    
                } else if sum < 0 {
                    j += 1
                } else {
                    k -= 1
                }
            }
            let same = sortednums[i]
            while i < sortednums.count && same == sortednums[i] {
                i += 1
            }
        }
        return result
    }
}