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 = ...
  • runningtortoises
  • runningtortoises
  • 2015年05月09日 21:06
  • 4051

LeetCode 15 3Sum(3个数的和)

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

15. 3sum(重要)

15. 3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • gao1440156051
  • gao1440156051
  • 2016年08月24日 16:41
  • 272

【LeetCode】3Sum 解题报告

这道题凭我现有知识实在解答不上来,只好网上搜索解法,才发现 K Sum 是一类问题,但是网上没有比较简洁的代码,我想对于初学者来说,可能还是想先看看这道题怎么解,然后才有兴趣去看其扩展吧。 【题目】 ...
  • ljiabin
  • ljiabin
  • 2014年10月30日 16:00
  • 28565

[LeetCode] 3Sum分析与C/C++解法

前言3Sum算是LeetCode最经典的十几道题之一了,据说在面试中出现的频率相当高。所以在这里花点篇幅讨论一下此题。题目https://leetcode.com/problems/3sum/ Gi...
  • allenzyoung
  • allenzyoung
  • 2016年03月08日 21:23
  • 252

leetcode 3sum c语言

c语言版本我只是写出了输出版本,由于对c的二维指针内存分配不是很清楚,所以没有按照题目上规定定义函数。 如果有人看到能帮我修改一下最好了,欢迎留言。 思路: 1,先按照由小到大把数组排序 2,...
  • way88liu
  • way88liu
  • 2015年07月10日 09:59
  • 799

3sum

关键点:1.是用2个指针表示搜索起始范围,动态改变2个指针位置,缩小搜索次数,从而使得时间为O(N^2) 2.避免重复,用一个值来记录之前计算时的值,如果相同则++startPostion或者--e...
  • leafinsnowfield
  • leafinsnowfield
  • 2018年01月29日 04:02
  • 14

LeetCode 16 3Sum Closest(C,C++,Java,Python)

Problem: Given an array S of n integers, find three integers in S such that the sum is closest ...
  • runningtortoises
  • runningtortoises
  • 2015年05月09日 22:26
  • 1724

[LeetCode]3Sum

题目要求如下: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • zhouworld16
  • zhouworld16
  • 2013年11月24日 11:20
  • 7431

3Sum

题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = ...
  • u010378705
  • u010378705
  • 2014年06月16日 22:13
  • 463
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode 3sum c语言
举报原因:
原因补充:

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