15. 三数之和(Swift版)

作者: Mage | 来源:发表于2018-12-19 11:37 被阅读8次

    一、题目

    给定一个包含 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

    相关文章

      网友评论

        本文标题:15. 三数之和(Swift版)

        本文链接:https://www.haomeiwen.com/subject/ybwkkqtx.html