1.4.15快速3-sum。作为热身,使用一个线性级别的算法(而非基于二分查找的线性对数级别的算法)实现TwoSumFaster来计算已排序的数组中和为0的整数对的数量。用相同的思想为3-sum问题给出一个平方级别的算法。
答:
import java.util.Arrays;
public class TwoSumFaster
{
public static int count(int[] a)
{
int i=0;
int j=a.length-1;
int cnt=0;
int sum;
while(i<j)
{
sum=a[i]+a[j];
if(sum==0)
{
// StdOut.printf("a[%d]=%d,a[%d]=%d ",i,j,a[i],a[j]);
i++;
j--;
cnt++;
}
else if(sum>0)
j--;
else
i++;
}//end while
return cnt;
}//end count
public static void main(String[] args)
{
int[] a=In.readInts(args[0]);
Arrays.sort(a);
StdOut.println(count(a));
}
}
/////////////////////////////
import java.util.Arrays;
public class ThreeSumFaster
{
public static int count(int[] a)
{
int j;
int k;
int cnt=0;
int sum;
for(int i=0;i<a.length;i++)
{
j=i+1;
k=a.length-1;
while(j<k)
{
sum=a[i]+a[j]+a[k];
if(sum==0)
{
j++;
k--;
cnt++;
}
else if(sum>0)
k--;
else
j++;
}//end while
}//end for
return cnt;
}//end count
public static void main(String[] args)
{
int[] a=In.readInts(args[0]);
Arrays.sort(a);
StdOut.println(count(a));
}
}
答:
import java.util.Arrays;
public class TwoSumFaster
{
public static int count(int[] a)
{
int i=0;
int j=a.length-1;
int cnt=0;
int sum;
while(i<j)
{
sum=a[i]+a[j];
if(sum==0)
{
// StdOut.printf("a[%d]=%d,a[%d]=%d ",i,j,a[i],a[j]);
i++;
j--;
cnt++;
}
else if(sum>0)
j--;
else
i++;
}//end while
return cnt;
}//end count
public static void main(String[] args)
{
int[] a=In.readInts(args[0]);
Arrays.sort(a);
StdOut.println(count(a));
}
}
/////////////////////////////
import java.util.Arrays;
public class ThreeSumFaster
{
public static int count(int[] a)
{
int j;
int k;
int cnt=0;
int sum;
for(int i=0;i<a.length;i++)
{
j=i+1;
k=a.length-1;
while(j<k)
{
sum=a[i]+a[j]+a[k];
if(sum==0)
{
j++;
k--;
cnt++;
}
else if(sum>0)
k--;
else
j++;
}//end while
}//end for
return cnt;
}//end count
public static void main(String[] args)
{
int[] a=In.readInts(args[0]);
Arrays.sort(a);
StdOut.println(count(a));
}
}