3Sum
Given an array nums of n integers, are there elements a, b, c in nums 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]
]
解题思路:
-
首先对数组进行排序,调用java自带的Arrays.sort()方法对数组进行升序排序
-
如果是 2Sum,我们找到两个指针之和为target就OK了,那 3Sum 类似,我们可以先固定一个数,然后找另外两个数之和为第一个数的相反数就可以了。
-
代码如下:
class Solution { List<List<Integer>> ret = new ArrayList<List<Integer>>(); public List<List<Integer>> threeSum(int[] nums) { if(nums==null&&nums.length<3) //对于空数组和数组长度小于3的数组没必要进行以下操作 return ret; Arrays.sort(nums);//对数组进行升序排序 for(int i=0;i<nums.length-2;i++){ if(i>0 &&nums[i]==nums[i-1]) // 避免重复!!!! continue; find(nums,i+1,nums.length-1,nums[i]); //寻找出与num[i]之和为0的两个数字 } return ret; } public void find(int[] nums,int begin,int end,int target){ int l=begin,r=end; while(l<r){ if(nums[l]+nums[r]+target==0){ List<Integer> list=new ArrayList<Integer>(); list.add(target); list.add(nums[l]); list.add(nums[r]); ret.add(list); while(l<r&&nums[l]==nums[l+1]) //避免重复 l++; while(l<r&&nums[r]==nums[r-1]) r--; l++; r--; }else if(nums[l]+nums[r]+target>0){ r--; }else{ l++; } } } }
运行结果: