给定排好序的数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X。给出一个O(n)的算法。

yjugdujcm 2011-09-26 08:53:27
有一个思路,算法如下,但不知是不是完备的,有没有漏洞
int i,j;

i = 0;
j = n-1;
while(A[j]>X)
--j;
while(i<j)
{
if(A[i]+A[j] == X)
{
cout<<A[i]<<endl;
cout<<A[j]<<endl;
break;
}
else
{
if(A[i]+A[j]>X)
{
--j;
}
else
++i;
}
}
各位有什么看法
...全文
837 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
大飞飞虫 2011-11-25
  • 打赏
  • 举报
回复
前台被问到这个问题了,据说有 n * x 复杂度的算法
yjugdujcm 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mingliang1212 的回复:]
C/C++ code

register int comp = A[i]+A[j] - X;
if(comp == 0)
{
cout<<A[i]<<endl;
cout<<A[j]<<endl;
break;
}
j -= comp > 0;
i += comp < 0;




应该放后面的。。搞错了。
[/Quote]
为啥要-=comp/+=comp呢
iamnobody 2011-10-06
  • 打赏
  • 举报
回复

register int comp = A[i]+A[j] - X;
if(comp == 0)
{
cout<<A[i]<<endl;
cout<<A[j]<<endl;
break;
}
j -= comp > 0;
i += comp < 0;



应该放后面的。。搞错了。
iamnobody 2011-10-06
  • 打赏
  • 举报
回复
思路不错。
顶一个。

如果还要优化:


if(A[i]+A[j] == X)
{
cout<<A[i]<<endl;
cout<<A[j]<<endl;
break;
}
else
{
if(A[i]+A[j]>X)
{
--j;
}
else
++i;
}

改成:

register int comp = A[i]+A[j] - X;
j -= comp > 0;
i += comp < 0;
if(comp == 0)
{
cout<<A[i]<<endl;
cout<<A[j]<<endl;
break;
}



但是比较难懂。
yjugdujcm 2011-10-06
  • 打赏
  • 举报
回复
谢谢回复
MYMGrub 2011-09-29
  • 打赏
  • 举报
回复
没啥问题的..有没有新招啊...
ndy_w 2011-09-29
  • 打赏
  • 举报
回复
应该是对的,没漏洞
cjohn1988 2011-09-29
  • 打赏
  • 举报
回复
帮你顶一下

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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