leetcode刷题笔记十五 三数之和 Scala版本
源地址:15. 三数之和
问题描述:
Given an array
nums
of n integers, are there elements a, b, c innums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
简要思路分析:
最简单的方法还是暴力法,三层循环,复杂度为O(n^3).
相比之下,较好的方式是使用hash表,通过选取两个数,然后根据hash寻找第三个数。
常用的方式是双指针法,由于三数之和为0,则三数之一必含有一个负数或者0,因此我们只需要对负数和0的列表进行遍历,在其中使用如十一题的双指针法,三数之和大于0,则正数指针向前一步,反之,负数指针向后一步,在O(n^2)内完成。
代码补充:
object Solution {
def threeSum(nums: Array[Int]): List[List[Int]] = {
val sortNum = nums.sorted
//var tempArr = List[Int]()
var resultArr = List[List[Int]]()
for (iCur <- 0 until sortNum.length if (sortNum(iCur) <= 0) if(iCur == 0 || sortNum(iCur) != sortNum(iCur-1))){
//val target = 0 - sortNum(iCur)
var left = iCur + 1
var right = sortNum.length - 1
while (left < right){
sortNum(left) + sortNum(right) + sortNum(iCur) match {
case sumArr if sumArr < 0 => left += 1
case sumArr if sumArr > 0 => right -= 1
case 0 => {
resultArr = resultArr :+ List(sortNum(iCur), sortNum(left), sortNum(right))
do (left += 1) while(left < right && sortNum(left) == sortNum(left-1))
do (right -= 1) while(left < right && sortNum(right) == sortNum(right+1))
}
}
}
}
return resultArr
}
}