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[] num) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(num==null || num.length<=2) {
return ret;
}
Arrays.sort(num);
int[] list = num;
HashMap<Integer, HashSet<Integer>> map = new HashMap<Integer, HashSet<Integer>>();
for(int i=0;i<list.length;i++) {
int n = list[i];
HashSet<Integer> set = map.get(n);
if(set==null) {
set = new HashSet<Integer>();
map.put(n, set);
}
set.add(i);
}
for(int i=0;i<list.length;i++) {
if(list[i]>0 || (i!=0&&list[i]==list[i-1])) {
continue;
}
for(int j=i+1;j<list.length;j++) {
if(j!=i+1 && list[j]==list[j-1]) {
continue;
}
int target = 0 - list[i] - list[j];
if(target<list[j]) {
break;
}
HashSet<Integer> set = map.get(target);
if(set!=null) {
for(Integer idx : set) {
if(idx>j) {
ArrayList<Integer> tuple = new ArrayList<Integer>();
tuple.add(list[i]);
tuple.add(list[j]);
tuple.add(target);
ret.add(tuple);
break;
}
}
}
}
}
return ret;
}
}
public class Solution {
public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>();
for(int i=0;i<num.length;i++) {
ArrayList<Integer> set = map.get(num[i]);
if(set==null) {
set = new ArrayList<Integer>();
map.put(num[i], set);
}
set.add(i);
}
ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
HashSet<String> rs = new HashSet<String>();
HashSet<Integer> cache = new HashSet<Integer>();
for(int i=0;i<num.length;i++) {
int a = num[i];
if(cache.contains(a)) {
continue;
}
HashSet<Integer> cache2 = new HashSet<Integer>();
for(int j = i+1;j<num.length;j++) {
int b = num[j];
if(cache2.contains(b)) {
continue;
}
int c = 0 - a - b;
ArrayList<Integer> lst = map.get(c);
if(lst!=null && lst.get(lst.size()-1)>j) {
ArrayList<Integer> tuple = new ArrayList<Integer>();
tuple.add(a);
tuple.add(b);
tuple.add(c);
Collections.sort(tuple);
String key = tuple.get(0) + "_" + tuple.get(1) + "_" + tuple.get(2);
if(!rs.contains(key)) {
rst.add(tuple);
rs.add(key);
}
cache.add(a);
cache2.add(b);
}
}
}
return rst;
}
}
========
public class Solution {
public List<List<Integer>> threeSum(int[] num) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
Arrays.sort(num);
helper(num, 0, 0, new ArrayList<Integer>(), res);
return res;
}
private void helper(int[] num, int cur, int curSum, List<Integer> curList, List<List<Integer>> res) {
if (curList.size() == 3 && curSum == 0) {
List<Integer> newList = new ArrayList<Integer>(curList);
res.add(newList);
} else if (curList.size() < 3) {
for (int i = cur; i < num.length; i++) {
int n = num[i];
curList.add(n);
helper(num, i + 1, curSum + n, curList, res);
curList.remove(curList.size() - 1);
while (i != num.length - 1 && num[i] == num[i + 1]) {
i++;
}
}
}
}
}
=========
public class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (nums == null || nums.length < 3) {
return res;
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
if (i != 0 && nums[i] == nums[i - 1]) {
continue;
}
int target = -1 * nums[i];
int s = i + 1;
int e = nums.length - 1;
while (s < e) {
int sum = nums[s] + nums[e];
if (sum == target) {
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[s]);
list.add(nums[e]);
res.add(list);
while (s < e && nums[s] == nums[s + 1]) {
s++;
}
while (s < e && nums[e] == nums[e - 1]) {
e--;
}
s++;
e--;
} else if (sum < target) {
s++;
} else {
e--;
}
}
}
return res;
}
}
没有评论:
发表评论