给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出满足所有满足条件的且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
解法一
思路如下:
- 首先排序,减少多余操作,从小到大进行排序
- 进行重复过滤
- 将三数之和为0可以转化为a + b = -c ,转化为两个数之和与-c相比较
- 通过下标i,下标low = i + 1、下标high = nums.count - 1来判断相等target = 0 - nums[i]
- nums[low] + nums[high] = target,则加入结果集同时i右移,high左移继续遍历,若< target,则右移,若> target则左移
var nums = [-1, 0, 1, 2, -1, -4] func threeSum(_ nums: [Int]) -> [[Int]] { guard nums.count > 2 else {return [] }//数组长度小于等于2,则返回空 let numsSort = nums.sorted()//数组排序 var resultArr = [[Int]]() for i in 0..<numsSort.count { if i > 0 && numsSort[i] == numsSort[i - 1] {continue}//重复过滤 let target = 0 - numsSort[i] //将a + b + c = 0,转化为 a + b = -c var low: Int = i + 1 var high: Int = numsSort.count - 1 while low < high { let sum = numsSort[low] + numsSort[high] if sum == target { let result = [numsSort[i], numsSort[low],numsSort[high]] resultArr.append(result) while low < high && numsSort[low] == numsSort[low + 1] { low = low + 1 } while low < high && numsSort[high] == numsSort[high - 1]{ high = high - 1 } low = low + 1 high = high - 1 } else if sum < target { low = low + 1 } else { high = high - 1 } } } return resultArr } var results: [[Int]] = threeSum(nums)
解法二
思路如下:
- 首先对数组进行排序,排序后固定一个数nums[i],则使用左右指针指向nums[i]后面的两端,数字分别为
numsSorted[low]和numsSorted[high],计算三个数的是否为target = 0,如果满足则添加进结果集
2. 如果numsSorted[i]大于0,如果已经排好序之后,则三数之和必然无法等于0,结束循环
3. 如果 numsSorted[i] == numsSorted[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
4. 当sum == 0 ,numsSorted[low] == numsSorted[low + 1]则会导致结果重复,应该跳过
5. 当sum == 0 ,numsSorted[high] == numsSorted[high + 1]则会导致结果重复,应该跳过
var nums = [-1, 0, 1, 2, -1, -4] func threeSum(_ nums: [Int]) -> [[Int]] { guard nums.count > 2 else {return []} var resultArr = [[Int]]() var numsSorted: [Int] = nums.sorted() for i in 0..<numsSorted.count { if numsSorted[i] > 0 {break} if i > 0 && numsSorted[i] == numsSorted[i - 1] {continue} var low = i + 1 var high = numsSorted.count - 1 while low < high { let target = numsSorted[i] + numsSorted[low] + numsSorted[high] if target == 0 { let result: [Int] = [numsSorted[i], numsSorted[low], numsSorted[high]] resultArr.append(result) while (low < high && numsSorted[low] == numsSorted[low + 1]) { // low ++//在swift3中low++被移除了 low += 1 } while low < high && numsSorted[high] == numsSorted[high - 1] { high -= 1 } low += 1 high -= 1 } else if target < 0 { low += 1 } else { high -= 1 } } } return resultArr } var results: [[Int]] = threeSum(nums) print(results)
上面的两份代码可以直接运行查看结果,都是如下
如果想进大公司,还是希望大家能手动敲写一下,对自己还是很有用的!!!