牛骨文教育服务平台(让学习变的简单)
博文笔记

threeSum

创建时间:2017-07-27 投稿人: 浏览次数:371
/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
 /*
 解决思路:
      先对数组进行升序排序
	  然后对数组进行遍历 让第一个数等于第二个数和第三个数的负数,由于数组已经有序,第一个数是遍历的次序为n,
	  第二个数为n+1,第三个数为数组的最后一个数组即最大的数,根据三个数和与0进行比较,然后通过向后调整第二个数与向前调整第三个数
	  查看是否有满足条件的数值,如果有则进行保存,并跳过相同的数值重复循环。
	  
调试过程:Runtime Error Message: realloc(): invalid next size: 0x0000000000bff750 ***
     在重复条用realloc()函数,出现堆损坏,地址越界
 
 */
 
 
#include <stdio.h>
#include <stdlib.h>
 
void quick_sort(int *arr,int l,int r) 
{
	if(l>=r) return;
	int temp=arr[l];
	int i=l,j=r;
	while(i<j)
	{
		while(i<j && arr[j]>=temp)
			j--;
		if(i<j)
			arr[i++]=arr[j];
		while(i<j && arr[i]<temp)
			i++;
		if(i<j)
			arr[j--]=arr[i];
	}
	arr[i]=temp;
	quick_sort(arr,l,i-1);
	quick_sort(arr,i+1,r);
}
 
int** threeSum(int* nums, int numsSize, int* returnSize)
{
    quick_sort(nums,0,numsSize-1);//先排序
	//int j=0;
	// for(;j<numsSize;j++)
		// printf("%d  ",nums[j]);
	int **re=(int **)malloc(sizeof(int*)*100);
	int *nums_r=nums;
	int i=0;
	int targe,*front,*back;
	int sum=0;
	int mem_sum=100;//用来标记指针数组的大小
	for(;nums_r<nums+numsSize;nums_r++)
	{
		targe=*nums_r;
		front=nums_r+1;
		back=nums+numsSize-1;
		while(front<back)
		{
			sum=*front + *back;
			if(sum+targe<0)
				front++;
			else if(sum+targe>0)
				back--;
			else
			{
				int my_len=sizeof(*re)/sizeof(int*);//错误 sizeof(re)并不能返回指针指向内存的大小 而是返回保存该指针的大小
				printf("my_len:%d
",my_len);
				if(i>mem_sum)
				{
					printf("ok
");
					re=(int **)realloc(re,sizeof(int*)*(10+mem_sum));
					mem_sum+=10;
					printf("ok
");
				}
					
				if(re==NULL)
				{
					printf("mem not 
");
					return NULL;
				}
				int*p= (int*)malloc(3*sizeof(int));
				*(re+i)=p;
				p[0]=*nums_r;
				p[1]=*front;
				p[2]=*back;
				i++;
				printf("p:%d %d %d i:%d
",p[0],p[1],p[2],i);
				while(front<back && p[1]==*front) front++;//跳过重复的
				while(front<back && p[2]==*back) back--;//跳过重复的
			}
		}
		while(nums_r<nums+numsSize-1 && *nums_r==*(nums_r+1)) nums_r++;//跳过重复的组
	}
	*returnSize=i;
	printf("%d
",i);
	return (int **)re;
}
int main(int argc, char **argv)
{
	int arr[]={1,0,-4,3,-3,2,4,-2,2,2,3,-4,-3,-1,-5,-1,1};
	int *b=NULL;
	int returnSize;
	int len=sizeof(arr)/sizeof(int);
	printf("len:%d
",len);
	int **p=threeSum(arr,len,&returnSize);
	int i=0;
	for(;i<returnSize;i++)
		printf("%d %d %d
",p[i][0],p[i][1],p[i][2]);
	return 0;
}



























声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。