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)
Solution:
Time-complexity $O(n^2)$ and space-complexity$O(n)$ (Using HashTable):
public class Solution { public ArrayList<ArrayList<Integer>> threeSum(int[] num) { Arrays.sort(num); HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int i=0; i<num.length; i++) { if (map.containsKey(num[i])) map.put(num[i], map.get(num[i])+1); else map.put(num[i], 1); } ArrayList<ArrayList<Integer>> sol = new ArrayList<ArrayList<Integer>>(); for(int i=0; i<num.length-2; i+=map.get(num[i])) { for(int j=i+1; j<num.length-1; j= num[i]==num[j]? j+map.get(num[j])-1: j+map.get(num[j])) { int temp= -(num[i]+num[j]); int duplicates = temp==num[j] ? temp==num[i] ? 2 : 1 : 0; if(temp>= num[j] && map.containsKey(temp) && map.get(temp)>duplicates) { ArrayList<Integer> onesol = new ArrayList<Integer> (); onesol.add(num[i]); onesol.add(num[j]); onesol.add(temp); sol.add(onesol); } } } return sol; } }
Time-complexity $O(n^2 log n)$ and space-complexity$O(1)$ (Binary Search):
public class Solution { public ArrayList<ArrayList<Integer>> threeSum(int[] num) { ArrayList<ArrayList<Integer>> solution = new ArrayList<ArrayList<Integer>>(); Arrays.sort(num); for(int i=0; i < num.length-2; i++) { if(i>0 && num[i-1]==num[i]) continue; for(int j=i+1; j < num.length-1; j++) { if(j>i+1 && num[j-1]==num[j]) continue; if (binarySearch(num, -(num[i]+num[j]), j+1, num.length-1)) { ArrayList<Integer> triplet = new ArrayList<Integer>(); triplet.add(num[i]); triplet.add(num[j]); triplet.add(-(num[i]+num[j])); solution.add(triplet); } } } return solution; } private boolean binarySearch(int[] num, int goal, int start, int end) { if (start > end) return false; int midpoint = (start+end)/2; if (num[midpoint]==goal) return true; else if (num[midpoint]<goal) return binarySearch(num, goal, midpoint+1, end); else return binarySearch(num, goal, start, midpoint-1); } }
No comments :
Post a Comment