LeetCode15: 3 Sum

来源:互联网 发布:西南大学网络登录窗口 编辑:程序博客网 时间:2024/05/16 17:47

Given an array S of n integers, are there elements abc 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)

public class Solution {    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {        // Start typing your Java solution below        // DO NOT write main() function              Arrays.sort(num);        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();        if(num.length < 3)            return res;        // 3 indexes        int i=0,j,k;        // 3 values        int a,b,c;        int len = num.length;        while(i<=len-3){            a=num[i];            j=i+1;            k=len-1;            while(j<k){                b=num[j];                c=num[k];                if(a+b+c==0){                    ArrayList<Integer> list = new ArrayList<Integer>();                    list.add(a);                    list.add(b);                    list.add(c);                    res.add(list);                    // Very Important!!!                    j++;                    while(j<k && num[j]==b)                        j++;                    k--;                    while(j<k && num[k]==c)                        k--;                }                else if(a+b+c<0)                    j++;                else                    k--;            }            i++;            while(num[i]==a && i<=len-3)                i++;        }        return res;    }}

------------------------------------------------------------------------------------------------------------------------------------------

LL's solution:

public ArrayList<ArrayList<Integer>> threeSum(int[] num) {        // Start typing your Java solution below        // DO NOT write main() function        int len = num.length;        if(len<3)            return new ArrayList<ArrayList<Integer>>();                ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();                //create hashmap        HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();        for(int i = 0; i<len; i++){            if(map.containsKey(num[i])){                ArrayList<Integer> value = map.get(num[i]);                value.add(i);                map.put(num[i],value);            }            else{                ArrayList<Integer> value = new ArrayList<Integer>();                value.add(i);                map.put(num[i],value);            }        }                //iterate o(n^2)        for(int i = 1; i<len; i++)            for(int j=0; j<i; j++){                int a = num[i];                int b = num[j];                int c = 0-a-b;                if(map.containsKey(c)){                    ArrayList<Integer> value = map.get(c);                    for(int e:value){                        if(e!=i&&e!=j){                            //exist a triplet                            ArrayList<Integer> triplet = new ArrayList<Integer>();                            triplet.add(a);                            triplet.add(b);                            triplet.add(c);                            Collections.sort(triplet);                            if(res.indexOf(triplet)==-1)                                res.add(triplet);                        }                    }                }            }                return res;            }


原创粉丝点击