15. 三数之和(Swift版)

一、题目

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[
  [-1, 0, 1],
  [-1, -1, 2]
]

二、解题

现将nums排序,然后遍历排序后的arr,将赋值当前元素为first,旁边的元素为second(位置为left),最后一个元素为third(位置为right),然后移动left或right(需保证left<right).

  1. 如果(sum=first+second+third)sum>0,则right向左移动,right -= 1;
    2.如果sum<0,则left向右移动,left += 1;
    3.如果sum=0,则将[first, second, third]添加到result中,同时如果第left元素和第left+1的元素相等,则跳过这个元素,如果第right元素和第right-1的元素相等,也跳过这个元素,避免出现重复的三元组.

三、代码实现

    class Solution {
        
        func threeSum(_ nums: [Int]) -> [[Int]] {
            var ret = [[Int]]()
            if nums.count<=2 {
                return ret
            }
            
            var arr = nums.sorted()
            
            for i in 0..<arr.count-2 {
                let first = arr[i]
                if first>0 {
                    break
                }
                if i > 0 && arr[i] == arr[i-1] {
                    continue
                }
                var left = i+1
                var right = arr.count-1
                while left<right {
                    let second = arr[left]
                    let third = arr[right]
                    if first+second+third == 0 {
                        ret.append([first, second, third])
                        while left < right && arr[left] == arr[left+1] {
                            left += 1
                        }
                        while left < right && arr[right] == arr[right-1] {
                            right -= 1
                        }
                        left += 1
                        right -= 1
                    } else if first+second+third < 0 {
                        left += 1
                    } else {
                        right -= 1
                    }
                }
            }
            return ret
        }
    }

Demo地址:github

    原文作者:ma772528138
    原文地址: https://www.jianshu.com/p/31bf2d8e24f6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞