leetcode 3sum c语言

原创 2015年07月10日 09:59:31

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<stdio.h>
#include<stdlib.h>

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 ; i<n ;i++)
    {
        printf("%d  ", a[i]);
    }
}


void shell_sort(int a[],int len)
{
    int inc, i,j, tmp;
    for(inc = len/2; inc>0; inc /= 2)
    {
        for(i=inc;i<len;i++)
        {
            tmp = a[i];
            for(j=i;j>=inc; j-=inc)
            {
                if(tmp<a[j-inc])
                    a[j] = a[j-inc];
                else
                    break;
            }
            a[j] = tmp;
        }
    }


}



void threesum(int* nums, int numsize, int *returnsize)
{
    int i,j,a, m,n ,b,c;
    int t =0;
    for(i=0; i<numsize; i++)
    {
        a = nums[i];
        m = i+1;
        n = numsize -1;
        while(m<n && m>=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)

LeetCode 15 3Sum (C,C++,Java,Python)

Problem: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...

LeetCode 15 3Sum(3个数的和)

翻译给定一个有n个整数的数组S,是否存在三个元素a,b,c使得a+b+c=0? 找出该数组中所有不重复的3个数,它们的和为0。备注: 这三个元素必须是从小到大进行排序。 结果中不能有重复的3个数。例如...
  • NoMasp
  • NoMasp
  • 2015年10月17日 23:19
  • 3377

LeetCode::Two Sum C语言

#这是转载的# 学习hashTable 题目 Given an array of integers, find two numbers such that they add up to a ...

1---LeetCode【Two Sum】|C语言|总结

LeetCode Two Sum 总结 分析这道题用到的知识点,分析算法的优缺点,时间复杂度,空间复杂度...

【C语言】LeetCode 18 4Sum

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c ...
  • lv1224
  • lv1224
  • 2017年02月04日 14:51
  • 184

【LeetCode编程学习(C语言)】1.Two Sum

LeetCode编程之简单篇,两个数求和,采用穷举和hash对比
  • yake827
  • yake827
  • 2016年03月28日 13:39
  • 3851

leetcode3题 题解 翻译 C语言版 Python版

3. Longest Substring Without Repeating Characters Given a string, find the length of the long...

sha256sum c语言代码

  • 2014年09月28日 16:21
  • 5KB
  • 下载

Max Sum Plus Plus(ACM ,c语言)

  • 2012年04月10日 11:19
  • 3KB
  • 下载

【LeetCode】3Sum 解题报告

这道题凭我现有知识实在解答不上来,只好网上搜索解法,才发现 K Sum 是一类问题,但是网上没有比较简洁的代码,我想对于初学者来说,可能还是想先看看这道题怎么解,然后才有兴趣去看其扩展吧。 【题目】 ...
  • ljiabin
  • ljiabin
  • 2014年10月30日 16:00
  • 27007
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode 3sum c语言
举报原因:
原因补充:

(最多只允许输入30个字)