给定一个包含 n 个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], 满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
1 //方法一:暴力法,超时未通过 2 public List<List<Integer>> threeSum (int[] nums) { 3 int len = nums.length; 4 //List<Integer> innerList = new ArrayList<>(); innerList是一个引用数据类型,如果若直接添加,会导致前面的值改变 5 ArrayList<List<Integer>> outerList = new ArrayList<>(); 6 for(int i=0; i<len-2; i++) { 7 for(int j=i+1; j<len-1; j++) { 8 for(int k=j+1; k<len; k++) { 9 if(nums[k] == (-(nums[i] + nums[j]))) { 10 Integer[] arr = new Integer[] {nums[i], nums[j], nums[k]}; 11 Arrays.sort(arr); 12 if(outerList.isEmpty()) { 13 outerList.add(Arrays.asList(arr)); 14 } 15 ListIterator<List<Integer>> lit = outerList.listIterator(); 16 boolean flag = true; 17 while(lit.hasNext()) { 18 if(lit.next().equals(Arrays.asList(arr))) { 19 flag = false; 20 } 21 } 22 if(flag) { 23 lit.add(Arrays.asList(arr)); 24 } 25 } 26 } 27 } 28 } 29 return outerList; 30 } 31 32 public List<List<Integer>> threeSum2(int[] nums) { 33 List<List<Integer>> result = new ArrayList<>(); 34 if(nums.length == 0) { 35 return result; 36 } 37 Arrays.sort(nums); 38 int len = nums.length; 39 for(int i=0; i<len; i++) { 40 //第一次保证起始值不会重复,如[-2,-2,0,2] 41 if((i>0) && (nums[i] == nums[i-1])) { 42 continue; 43 } 44 int right = len - 1; 45 int left = i+1; 46 while(left < right) { 47 //第二次保证后面两数不会重复,如[-2,0,0,0,2,2] 48 if((left>(i+1)) && (nums[left] == nums[left-1])) { 49 left++; 50 continue; 51 } 52 int temp = nums[left] + nums[right]; 53 if(temp == -nums[i]) { 54 result.add(Arrays.asList(new Integer[] {nums[i], nums[left], nums[right]})); 55 left++; 56 right--; 57 }else if(temp > -nums[i]) { 58 right--; 59 }else { 60 left++; 61 } 62 } 63 } 64 return result; 65 }