15. 3Sum
Given an array S of n integers, are there elements a, b, c in S 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.
1 | For example, given array S = [-1, 0, 1, 2, -1, -4], |
题意:
给一个含有n个整数的S数组,是否有三元组a,b,c在S中使a + b + c = 0,在S中找到所有的不重复的三元组,当三元组的和为0的时候。
注意:
结果集不能包含重复的三元组。
思路:
这道题的思路和Two Sum差不多,简单方式是暴力查找,先排序,然后3层循环遍历数组,时间复杂度O(n3)。优化时,可以先固定一个数,再用两个指针l和r从这个数后面的两边往中间查找,当这三个数之和等于0的时候,记录一下,当之和大于0的时候,r左移,而当之和小于0的时候,l右移,直到l和r相遇。这个其实就是在Two Sum外层加1层循环,因此时间复杂度是排序的O(nlogn)加O(n2),即O(n2)。
由于三个数字需要按照非递减序列排放,因此先排序可以满足此要求。又要求不包含重复元素,因此在选择第一个数字的时候以及后面两个指针查找时,需要跳过重复元素
具体步骤:
- 先升序排序,然后用第一重for循环确定第一个数字。
- 然后在第二重循环里,第二、第三个数字分别从两端往中间扫。
- 如果三个数的sum等于0,得到一组解。
- 如果三个数的sum小于0,说明需要增大,所以第二个数往右移。
- 如果三个数的sum大于0,说明需要减小,所以第三个数往左移。
1 | class Solution { |
Java Code:
1 | class Solution { |