Leetcode之3Sum

来源:互联网 发布:907工程数据 编辑:程序博客网 时间:2024/04/30 06:56
【题目】

给定n个整数的数组S,是否在 数组S中有元素a,b,C,使得A + B + C =0?在数组中找出独一无二的三元素组,使得他们之和为0。

注意:

在三元素(A,B,C)中,必须满足非递减排序。 (即A≤B≤C)

该解决方案集一定不能包含重复的三元素组

【代码】

#include <stdio.h>#define N 20void 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");}


0 0