【题目】
给定n个整数的数组S,是否在 数组S中有元素a,b,C,使得A + B + C =0?在数组中找出独一无二的三元素组,使得他们之和为0。
注意:
在三元素组(A,B,C)中,必须满足非递减排序。 (即A≤B≤C)
该解决方案集中一定不能包含重复的三元素组。
【代码】
#include <stdio.h>
#define N 20
void swap(int array[],int low,int high)
{
int temp;
temp=array[low];
array[low]=array[high];
array[high]=temp;
}
void quicksort(int array[],int low,int high)
{
int i=low,j=high;
int pivot;
int pivotkey;
pivotkey=array[low];
if(low<high)
{
while(i<j)
{
while(i<j&&array[j]>=pivotkey)
j--;
swap(array,i,j);
while(i<j&&array[i]<=pivotkey)
i++;
swap(array,i,j);
}
pivot=i;
quicksort(array,low,pivot-1);
quicksort(array,pivot+1,high);
}
}
int sum2(int array[],int size,int sum,int index1[],int index2[])
{
int i=0;
int j=size-1;
int k=0;
while(i<j)
{
if((array[i]+array[j])>sum)
{
//注意,跳过重复的元素
while(i<j&&array[j]==array[j-1])
{
j--;
}
j--;
}
else
{
if((array[i]+array[j])<sum)
{
//注意,跳过重复的元素
while(i<j&&array[i]==array[i+1])
{
i++;
}
i++;
}
else
{
index1[k]=i;
index2[k]=j;
k++;
//注意,跳过重复的元素
while(i<j&&array[j]==array[j-1])
{
j--;
}
while(i<j&&array[i]==array[i+1])
{
i++;
}
i++;
j--;
}
}
}
return k;
}
int sum3(int array[],int size,int t,int *index1,int *index2,int *index3)
{
int i,j,s=0;
for(i=0;i<size-2;i++)
{
int result;
result=sum2(array+i+1,size-i-1,t-array[i],index2,index3);
if(result!=0)
{
for(j=0;j<result;j++)
{
*index1=i;
index1++;
*index2=*index2+i+1;
*index3=*index3+i+1;
index2++;
index3++;
}
s=s+result;
}
while(array[i+1]==array[i])
i++;
}
return s;
}
void main()
{
int a[6]={-2,0,0,2,2,0};
int i;
quicksort(a,0,5);
for(i=0;i<6;i++)
printf("%d ",a[i]);
printf("\n");
int index1[N],index2[N],index3[N];
int result;
result=sum3(a,6,0,index1,index2,index3);
printf("%d\n",result);
for(i=0;i<result;i++)
printf("%d %d %d\n",a[index1[i]],a[index2[i]],a[index3[i]]);
printf("\n");
}