您的位置:首页 > 其它

Leetcode no. 15

2016-04-25 09:38 323 查看


15. 3Sum



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)

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;
}
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: