给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
第一反应是穷举法,不过按经验leetcode上面稳会超时,pass
第二个,先把数组排序,然后从做到右开始计算。
每次定位到i,然后用两个指针,一个指向i+1,一个指向数组的末尾。按公式a+b+c=0做计算。
就变成了nums[i]+nums[start]+nums[stop] = 0
算是把三数之合简化成两数之和。
用kotlin实现(这种实现效率一般般算是勉强通过型,LeetCode上执行完测试用例耗时2216 ms)
fun threeSum(nums: IntArray): List<List<Int>> {
val resList: ArrayList<ArrayList<Int>> = ArrayList()
if (null == nums || nums.isEmpty()) resList
//Arrays.sort(nums)
nums.sort()
for (i in 0 until nums.size) {
var start = i + 1
var stop = nums.size - 1
while (start < stop) {
var sum = nums[i] + nums[start] + nums[stop]
when {
0 == sum -> {
//找了了一组
val list: ArrayList<Int> = ArrayList()
list.add(nums[i])
list.add(nums[start])
list.add(nums[stop])
if (list !in resList) {
resList.add(list)
}
//从两头往中间缩进
start++
stop--
}
sum > 0 -> stop--
sum < 0 -> start++
}
}
}
return resList
}
注:因为代码是直接在IDEA中写的,顺手用了Arrays.sort(nums)。结果LeetCode上面出现runtime 异常。
后面改为了nums.sort() 。多少有点无语。按说LeetCode应该兼容这种情况的。
写在这里算是做个简单的记录吧