Leetcode no. 15

15. 3Sum


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 List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list= new LinkedList<>();
        ArrayList<Integer> positives= new ArrayList<>();
        ArrayList<Integer> negatives= new ArrayList<>();
        HashMap<Integer, Integer> map= new HashMap<>();
        int zeroes=0;
        if (nums.length==0) return list;
        Arrays.sort(nums);
        for (int ele: nums) {
            if (ele>0) positives.add(ele);
            else if (ele<0) negatives.add(ele);
            else zeroes++;
            if (!map.containsKey(ele)) map.put(ele, 1);
        }
        if (zeroes>=3) list.add(new LinkedList<Integer>(){{add(0);add(0);add(0);}});
        if (zeroes>0){
            int prev=0;
            for (int ele: negatives) {
                if (prev==ele) continue;
                if (map.containsKey(Math.abs(ele))) list.add(new LinkedList<Integer>(){{add(ele);add(0);add(Math.abs(ele));}});
                prev= ele;
            }
        }
        if (negatives.size()==0 || positives.size()==0) return list;
        Integer[] nega= new Integer[negatives.size()];
        negatives.toArray(nega);
        Integer[] posi= new Integer[positives.size()];
        positives.toArray(posi);
        for (int i = 0; i < nega.length; i++) {
            if (i>0 && nega[i]==nega[i-1]) continue;
            int first= nega[i];
            for (int j = i+1; j < nega.length; j++) {
                if (j>i+1 && nega[j]==nega[j-1]) continue;
                int second= nega[j];
                if (map.containsKey(Math.abs(first+second))) list.add(new LinkedList<Integer>(){{add(first);add(second);add(Math.abs(first+second));}});
            }
        }
        for (int i = 0; i < posi.length; i++) {
            if (i>0 && posi[i]==posi[i-1]) continue;
            int first= posi[i];
            for (int j = i+1; j < posi.length; j++) {
                if (j>i+1 && posi[j]==posi[j-1]) continue;
                int second= posi[j];
                if (map.containsKey(0-first-second)) list.add(new LinkedList<Integer>(){{add(0-first-second);add(first);add(second);}});
            }
        }
        return list;
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值