算法每日一刷

LeetCode算法题-15. 三数之和(Swift)

2019-06-25  本文已影响0人  entre_los_dos

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum

题目

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

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

例如,

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

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

找出数组里面是否有三数之和等于0的三元组。如果有,找出所有不重复的三元组。

方法1-先排序。第一个数是for循环来找,后两个数在while循环里面由头+尾组成

func threeSum(_ nums: [Int]) -> [[Int]] {
        
        if nums.count < 3 {
            return []
        }
        var resultArr = [[Int]]()
        //先排序
        let nums = nums.sorted()
        for i in 0..<nums.count - 2 {
            let num1 = nums[i];
            //如果第一个数就大于0,则结束循环
            if num1 > 0 {
                break
            }
            if i > 0 && num1 == nums[i-1]{
                continue
            }
            //然后找两数之和=0-num1的两个数
            let sum = 0-num1
            var num2_index = i+1
            var num3_index = nums.count - 1
            
            while num2_index < num3_index {
                let num2 = nums[num2_index]
                let num3 = nums[num3_index]
                
                //跳出循环
                if num2 > sum {
                    break
                }
                //如果和上次的相等,跳出循环
                if num2_index > i+1 && num2 == nums[num2_index - 1] {
                    num2_index += 1
                    continue
                }
                if num3_index != nums.count - 1 && num3 == nums[num3_index + 1] {
                    num3_index -= 1
                    continue
                }
                //和为sum,则添加到resultArr里面
                if num2 + num3 == sum {
                    resultArr.append([num1, num2, num3])
                    num2_index += 1
                    num3_index -= 1
                }else if num2 + num3 < sum{
                   num2_index += 1
                }else  {
                    num3_index -= 1
                }

            }
        }
        return resultArr
        
    }

最后

不知道大家还有没有更好的方法,欢迎交流~

上一篇下一篇

猜你喜欢

热点阅读