leetcode 3sum c语言

c语言版本我只是写出了输出版本,由于对c的二维指针内存分配不是很清楚,所以没有按照题目上规定定义函数。

如果有人看到能帮我修改一下最好了,欢迎留言。

思路:

1,先按照由小到大把数组排序

2,循环取第i位,数值a[i],  后面剩余的由旁边向中间扫描,看是否符合 a[m]+a[n] == -a[i],如果a[m]+a[n]>-a[i],则向右边移动m,如果小于则向左边移动n 

/*************************************************************************
    > File Name: leetcode8.c
    > Author: wayne
    > Mail: @163.com 
    > Created Time: 2015年07月09日 星期四 15时52分33秒
    3sum
 ************************************************************************/

#include
#include

void swap(int *x, int *y)
{
    int tmp;
    tmp = *x;
    *x = *y;
    *y = tmp;

}

void print_array(int a[], int n)
{
    int i;
    for(i =0 ; i0; inc /= 2)
    {
        for(i=inc;i=inc; j-=inc)
            {
                if(tmp=0 && n>=0)
        {
           b = nums[m];
           c = nums[n];
            if(b+c > -a)
            {
                n--;
            }
            else if(b+c < -a)
            {
                m--;
            }
            else
            {
                printf("-- %d  %d  %d",i, m,n);
                printf("\n");
                printf("*** %d  %d  %d",nums[i], nums[m], nums[n]);
                m--;
                n--;
                printf("\n");
                t++;
                //break;
            }
        }

    }
}

 
int main()
{
    int a[] = {-1, 0, 1, 2, -1, -4};
    int numsize = sizeof(a)/sizeof(int);
    int returnsize = 3;
    shell_sort(a, numsize);
    print_array(a, numsize);
    printf("\n");
    threesum(a, numsize, &returnsize);
    printf("\n");
    return 0;
}
算法复杂度为o(n2)

你可能感兴趣的:(数据结构)