回 帖 发 新 帖 刷新版面

主题:难题!你感兴趣吗?请进。

你好!
    我这里有一个问题,想了一天多也找不也好的解决方法,如果你有好的方法,请告诉我好吗?在下不胜感激。
   问题是这样的:
   有n个整数,(1 <= n <= 1000 ),它们的值的范围是-536870912到+536870911(很大吧,呵) ,现在给一个数m,判断m是否是这n个数中的某三个数的和。

我写了关于这个问题的函数,可惜,速度不够快,其体如下:
/***************************************************************************
*函数原型:int compare(long *p, int n, long N)  
*函数功能:p指向从小到大的有序数组,n为该数组的个数,查找p指向的数组中是否有
*          三个元素的和为N
*返回值:  若存在则返回 1,否则返回 0;
****************************************************************************/

int compare(long *p, int n, long N)
{
    int i = 0;
    int j = 0;
    int k = 0;
    long temp = 0;

    for (i=0; i<n-2; i++)
        for (j=i+1; j<n-1; j++)
        {
            temp = N - p[i] - p[j];//计算N与任意两个数的差值;
            for (k=n-1; k>j; k--)  //将差值与其它的每一个值进行比较;
            {
                if (temp == p[k])
                {
                    return 1;
                }
                if (temp > p[k])
                {
                    break;
                }
            }
        }
    return 0;
}


你有什么更好的方法吗?

回复列表 (共11个回复)

沙发

个人觉得只要是最大的三个正数之和和最小的三个负数之和的范围内,一定是他们中某三个数的和吧?不知道对不对……

板凳

当然,楼上的说法是正确的,可是这也不能表明这个数m是这n个数中的三个数的和呀,不是吗?

3 楼

首先我是学pascal的
看c的程序还是挺晕的
勉强能看懂
倒是没看出什么更快的算法
因为数据规模忒大了

4 楼

关注一下~~

5 楼

我顶楼主

6 楼

估计没有什么好的办法了~。
没有必要排序,就象楼主那样一个一个找吧。

7 楼


可以对m进行分开处理,行吗?例m为大于1000的应在n 中1000以内取三个数,

8 楼

先排除不小于N的元素.
然后用背包算法,我还不是特别会,你去学学动态规划.
不过若用DP需要很多空间,或许可以结合回溯.

9 楼

不用这么复杂的吧,还有更简单的呢

10 楼

先做个初步判断:看这个要判断的数是不是在三个和的最大值和最小值之间.
如果是在做你的判断.
但也想不到什么更好的办法!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册