问一个算法问题

r11222 2010-08-05 02:08:14


问题:一个N个整数的无序数组,给你一个数sum,求出数组中是否存在两个数,使他们的和为sum

听说有个先排序然后两边夹的算法,具体是怎样?

如果数组中有负数,又怎样?

谢谢
...全文
196 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shell2522 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 foolbirdflyfirst 的回复:]
C/C++ code
#include <stdio.h>
#define count(a) sizeof(a)/sizeof(int)
int main()
{
int s[] = {-1,0,-2,1,2,2,3,4,7,9,11,13};
int sum = 7;
int i = 0;
int j = count(s)-1;
……
[/Quote]
huaxiamoyun 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 foolbirdflyfirst 的回复:]
C/C++ code
#include <stdio.h>
#define count(a) sizeof(a)/sizeof(int)
int main()
{
int s[] = {-1,0,-2,1,2,2,3,4,7,9,11,13};
int sum = 7;
int i = 0;
int j = count(s)-1;
……
[/Quote]
此程序编的真好
俺没这个能力
学习了
ayw215 2010-08-05
  • 打赏
  • 举报
回复
先排序,这个不用说了吧,O(nlg n)
两边夹就简单了,为O(N)
类似这个算法的解答

题目:输入一个正数n,输出所有和为n连续正数序列。

例如输入,由于+2+3+4+5=4+5+6=7+8=15,所以输出个连续序列-5、-6和-8。因为整数序列是有序的,可以设立两个游标small,big,通过判区间[small,big]的和是否为N来得到这个序列。如果区间和大于n,small往前移动,如果小于n,big往前移动,等于就输出这个区间。时间复杂度是(n).
void ContinuousSequenceSum_1(int n)
{
int small = 1;
int big = 2;
int sum = small + big;
while(small < big && big <= n/2+1)
{
if(sum == n)
printf("start=%d, end=%d\n",small,big);
if(sum > n)
{
sum -= small;
small++;
}
else
{
big++;
sum += big;
}
}
}

mudunke775 2010-08-05
  • 打赏
  • 举报
回复
有负数时,POS要重新定位,后面的都一样
foolbirdflyfirst 2010-08-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#define count(a) sizeof(a)/sizeof(int)
int main()
{
int s[] = {-1,0,-2,1,2,2,3,4,7,9,11,13};
int sum = 7;
int i = 0;
int j = count(s)-1;
int g = 0;
while(i!=j)
{
if(s[i]+s[j] > sum) j--;
else if(s[i]+s[j] < sum) i++;
else
{
g = 1;
printf("%d+%d=%d\n",s[i],s[j],sum);
i++;
}
}
if(!g) printf("Not found!\n");
return 0;
}

mudunke775 2010-08-05
  • 打赏
  • 举报
回复
a[N]已经从小到大排序好了,在无负数的情况下
int pos = N;
for(int i=0;i<N,++i)
{
if(a[i] > sum)
{
pos = i;
break;
}
}
for(int i=0;i<pos;++i)
{
for(int j=pos-1;j>0;--j)
{
if(a[i]+a[j] == sum)
{
//输出
}
else if(a[i]+a[j]<sum)
{
pos=j+1;
break;
}
}
}
r11222 2010-08-05
  • 打赏
  • 举报
回复
先由大到小排序,然后两个两个加 ,比较,两个循环就可以了,不过貌似方法比较笨,呵呵,跟负数应该没啥关系吧,负数也可以排序跟相加的


这个不行,太慢了,没有利用好特征
tczf1128 2010-08-05
  • 打赏
  • 举报
回复
先由大到小排序,然后两个两个加 ,比较,两个循环就可以了,不过貌似方法比较笨,呵呵,跟负数应该没啥关系吧,负数也可以排序跟相加的

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧