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 ArrayList<ArrayList<Integer>> threeSum(int[] num)
{
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<Integer> tmp;
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
int a,b,c;
int aa[] = new int[19];
if(num.length <3)
{
return res;
}
for(int i=num.length-1; i >=0 ; i--)
{
a = num[i];
for(int j = i-1; j >=0; j--)
{
b = num[j];
for(int k = j-1; k >=0 ; k--)
{
c = num[k];
if(a+b+c == 0)
{
tmp = new ArrayList<Integer>();
int tmp1[] = max(a,b,c);
tmp.add(tmp1[0]);
tmp.add(tmp1[1]);
tmp.add(tmp1[2]);
//去除重复
if(res.indexOf(tmp) == -1)
{
res.add(tmp);
}
}
}
}
}
return res;
}
//返回三个数递增大小序列
public int[] max(int a,int b,int c)
{
int res[] = new int[3];
if(a<=b)
{
if(b<=c)
{
res[0]=a;
res[1]=b;
res[2]=c;
}
else if(a <= c)
{
res[0]=a;
res[1]=c;
res[2]=b;
}
else
{
res[0]=c;
res[1]=a;
res[2]=b;
}
}
else
{
if(b>=c)
{
res[0]=c;
res[1]=b;
res[2]=a;
}
else if(c<=a)
{
res[0]=b;
res[1]=c;
res[2]=a;
}
else
{
res[0]=b;
res[1]=a;
res[2]=c;
}
}
return res;
}
}
以上是最简单实现,满足功能要求,为满足性能要求,目前在改进中。
更新:对于三个数排序使用冒泡思想改造函数:
public int[] max(int a,int b,int c)
{
int res[] = new int[]{a,b,c};
int temp = 0;
if(res[0] > res[1])
{
temp = res[0];
res[0] = res[1];
res[1] = temp;
}
if(res[1] > res[2])
{
temp = res[1];
res[1] = res[2];
res[2] = temp;
}
if(res[0] > res[1])
{
temp = res[0];
res[0] = res[1];
res[1] = temp;
}
return res;
}
其中交换a,b的值可以用另一种方法:
public void exchange(int a,int b)
{
a = a+b;
b = a-b;
a = a-b;
}