题目:
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:
- Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
- The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
思路:先对数组排序,for循环选定每个位置的数,在下个位置及末尾设置两个索引,从两边往中间走,找出两个数满足三者的和为0。因为数组有序,所以当和大于0时,右边索引左移,反之,左边索引右移。
- public class Solution {
- public List<List<Integer>> threeSum(int[] nums) {
- List<List<Integer>> result=new ArrayList<List<Integer>>();
- int len=nums.length;
- if(len<3) return result;
- int sum=0;
- Arrays.sort(nums);
- for(int i=0;i<nums.length;i++){
- if(nums[i]>0) break;
- if(i>0&&nums[i]==nums[i-1]) continue;
- int begin=i+1,end=len-1;
- while(begin<end){
- sum=nums[i]+nums[begin]+nums[end];
- if(sum==0){
- List<Integer> tem=new ArrayList<Integer>();
- tem.add(nums[i]);
- tem.add(nums[begin]);
- tem.add(nums[end]);
- result.add(tem);
- begin++;end--;
- while(begin<end&&nums[begin]==nums[begin-1]) begin++;
- while(begin<end&&nums[end]==nums[end+1]) end--;
- }else if(sum<0){
- begin++;
- }else end--;
- }
- }
- return result;
- }
- }