Leetcode之3Sum

【题目】

给定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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值