15. 3Sum

来源:互联网 发布:广东省网络问政 编辑:程序博客网 时间:2024/06/08 08:12

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.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
代码解析:此题和之前的2sum很相似,不同的就是它可以有多个结果用list表示,去掉重复是重要的步骤

public class Solution2 {      public static void main(String[] args) {        int [] nums = {-1, 0 ,1, 2 ,-1 ,-4};        System.out.println(threeSum(nums));        // TODO Auto-generated method stub    }    public static List<List<Integer>> threeSum(int[] nums) {          List<List<Integer>> sumList = new ArrayList<List<Integer>>();          if(nums.length < 3)              return sumList;          Arrays.sort(nums);          for(int i=0; i<nums.length-2; i++) {          //去重nums[i] > nums[i - 1]            if (i == 0 || nums[i] > nums[i - 1]) {              int start = i+1;              int end = nums.length-1;              while(start<end) {                  if(nums[i]+nums[start]+nums[end] == 0) {                      ArrayList<Integer> tempList = new ArrayList<Integer>();                      tempList.add(nums[i]);                      tempList.add(nums[start]);                      tempList.add(nums[end]);                      sumList.add(tempList);                      start++;                      end--;                      //去掉重复的数据                      while((start<end) && (nums[end]==nums[end+1]))                          end--;                      while((start<end) && (nums[start]==nums[start-1]))                          start++;                  } else if(nums[i]+nums[start]+nums[end] > 0) {                      end--;                  } else {                      start++;                  }              }          }          }          return sumList;      }  }  
0 0