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]]
题目意思:
给一组数组,要求得出所有和为0的数字组合,要求数字组合不能重复出现,并且按照升序排列
思路:
先对数组进行排序,时间复杂度O(log(n)),然后定好一个数的位置,查找另外两个数的和等于-nums[i]的组合,由于数组排好序了,所以可以从两边往中间走,当结果大于0的时候后边往后退一步,否则前边进一步,时间复杂度O(n^2),所以时间复杂度为O(n^2)
源代码:public class Solution { public List<List<Integer>> threeSum(int[] nums) { if(nums.length < 2){ return null; } //System.out.println(nums); Arrays.sort(nums); List<List<Integer>> list = new ArrayList<List<Integer>>(); for(int i = 0; i < nums.length - 2; i++){ if(nums[i] > 0) break; if(i > 1 && nums[i] == nums[i-1]){ continue; } for(int j = nums.length - 1; j > i + 1; j--){ if(nums[j] < 0) break; if(j < nums.length -1 && nums[j] == nums[j+1]){ continue; } //System.out.println(nums[i]); int c = -(nums[i] + nums[j]); int k = search(c,nums,i+1,j-1); if(k > 0){ List<Integer> al = new ArrayList<Integer>(); al.add(nums[i]); al.add(nums[k]); al.add(nums[j]); list.add(al); } } } return list; } //二分查找数值c的位置,找到返回位置;找不到返回-1 public static int search(int c,int[] nums,int start,int end){ if(c < nums[start] || c > nums[end]) return -1; int k = 0; while(start <= end){ k = (start + end)/2; System.out.println(k); if(c > nums[k]){ start = k + 1; }else if(c < nums[k]){ end = k - 1; } else{ return k; } } return -1; } }