15. 3Sum:三数之和为0的组合
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] ]
思路:循环法,先给数组排序->[-4,-1,-1,0,1,2],其中i,j,k三数的下标,i先为最左边的一个数,则i<n-3,此时可以根据求两数之和的方法来进行求解;
对一个有序的数组求两数之和为定值,最简单的方法为j,k分别为数组的两端,主键向中间靠拢;
具体代码如下:
import java.util.*; public class Solution { public List<List<Integer>> threeSum(int[] nums) { List<List<Integer>> lists = new ArrayList<>(); if(nums==null||nums.length==0) return lists; Arrays.sort(nums); int n = nums.length; int i=0; while(i<=n-3){ int j=i+1; int k = n-1; while(j<k){ if(nums[i]+nums[j]+nums[k]==0){ ArrayList<Integer> list = new ArrayList<Integer>(); list.add(nums[i]); list.add(nums[j]); list.add(nums[k]); lists.add(list); while(j<k&&nums[j]==nums[j+1]) j++; while(k>j&&nums[k]==nums[k-1]) k--; j++; k--; }else if(nums[i]+nums[j]+nums[k]<0){ j++; }else{ k--; } } while(i<n-1&&nums[i]==nums[i+1]) i++; i++; } return lists; } }