【算法比赛】在一个整数数组中寻找符合A+B=C的组合,使C为最大。看谁的算法最快。

王集鹄 2008-05-22 11:27:08
加精
刚才在C/C++版看到这个算法问题。。。就搬到这里大家一起玩玩。。。

[Quote=说明]在一个整数数组中寻找符合A+B=C的组合,使C为最大
A、B、C为数组三个不同的元素
数组的长度小于30000[/Quote]

[Quote=输入、输出范例]输入:{ 1, 4, 2, 3 }
输出:1+3=4

输入:{ 2, 3, 1, 4, 5 }
输出:2+3=5

输入:{ 5, 8, 3, 1, 2, 4, 4 }
输出:4+4=8

输入:{ 4, 4, 5, 0, 1, 2, 3, 8, 9, 9, 100 }
输出:0+9=9[/Quote]

测试代码:
private void button1_Click(object sender, EventArgs e)
{
#region 初始化数组
int[] array = new int[arrayLength];
Random random = new Random(1000); // 固定随机种子,使大家测试数据一致
for (int i = 0; i < array.Length; i++)
array[i] = random.Next(arrayLength * 10);
#endregion 初始化数组

int A, B, C;
long tickCount = Environment.TickCount;
Search(array, out A, out B, out C);
Console.WriteLine("计算结果:A={0} B={1} C={2},耗时:{3}",
A, B, C, Environment.TickCount - tickCount);
}

public void Search(int[] array, out int A, out int B, out int C)
{
A = -1;
B = -1;
C = -1;
/* TODO : 自由发挥 */
}


最优算法奖励100分,其他酌情散掉。[img=http://p.blog.csdn.net/images/p_blog_csdn_net/jeffrey84/391881/o_tusiji%20(33).gif]图[/img]
...全文
7908 347 打赏 收藏 转发到动态 举报
写回复
用AI写文章
347 条回复
切换为时间正序
请发表友善的回复…
发表回复
aigoruan 2011-10-16
  • 打赏
  • 举报
回复
先开30000的内存,然后排序,从最大的开始serch,从最小的开始枚举,二分查找第二个数。也就是O(2*nlogn);
aigoruan 2011-10-16
  • 打赏
  • 举报
回复
哦,其实O(nlogn)也可以的,
aigoruan 2011-10-16
  • 打赏
  • 举报
回复
个人觉得很简单,在O(N^2/2)的时间出来多大的问题。
PPQTANKPPQ 2011-10-10
  • 打赏
  • 举报
回复
mark
luojianxiang 2011-09-30
  • 打赏
  • 举报
回复
我能想到的 控制 O(n平方)的方法就是牺牲内存。
选对本身 数组 双重循环求和 将结果保存到一个新数组中,n平方
然后 排序 ,快拍的话 是nlogn
然后将新数组中的数字去原串 折半查找,最坏nlogn
由于上三条是顺序的 所以最终算法复杂度 n平方
牺牲了内存
yanyi1210 2010-01-09
  • 打赏
  • 举报
回复
关注..
ylwqhr 2009-12-28
  • 打赏
  • 举报
回复
收藏,学习!~
li441944681 2009-11-18
  • 打赏
  • 举报
回复
期待中……
kerneliahou 2008-12-19
  • 打赏
  • 举报
回复
bucuo, up
jznhljg 2008-12-01
  • 打赏
  • 举报
回复
时间复杂度下限是O(n*logn)吧?
Eagle_ice 2008-11-19
  • 打赏
  • 举报
回复
看到 这样的代码 自己只能学习...
tssheng1987 2008-09-16
  • 打赏
  • 举报
回复
学习啊 没办法啊
wangchao1982 2008-08-01
  • 打赏
  • 举报
回复
CSDN的静态页面有点问题,别人的回答有的时候看不到,很显然这是有多个由该页面生成的静态页面
wangchao1982 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 321 楼 zswang 的回复:]
由于回复太多。。。页面打开太慢。。。恕我不能做到更公平的给分。。。

最后感谢所有参与讨论的人。。。
[/Quote]

来晚了,咩俺的事情了
wangchao1982 2008-07-31
  • 打赏
  • 举报
回复
为啥俺的恢复没了呢?
wangchao1982 2008-07-31
  • 打赏
  • 举报
回复
如果将数组拆分成2个数组,平均查找时间会缩短一倍。没有加这个的肯定是被pass了
wangchao1982 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 wanghui0380 的回复:]
一个大数分解问题

1.排序找到最大数i
2.如果i为素数,移除i,然后找另一个最大数
3.如果i为和数,将i分解成素数集合
4.然后对于这个素数集合进行排列

大体如此
[/Quote]
13 = 4 + 9 = 10 + 3
11 = 2 + 9 = 5+ 6
素数可以拆成两个数相加的
wangchao1982 2008-07-31
  • 打赏
  • 举报
回复
既然还没结贴,我先说下自己的思路,具体实现还没弄
1)将数组拆成2个,一个用来存奇数,一个用来存偶数。原因是:奇+奇 = 偶。偶 + 偶 = 偶。 奇 + 偶 = 奇
2)分别对两个数组排序(从大到小,从小到大无所谓)
3)然后就是从两个数组中找最大的数C,然后根据1)中的规律从这两个数组中找A和B
比如1数组1,3,5,7,9
2数组2,4,6,8,10
那么查找的顺序肯定是10 = A + B, 9 = A + B.......
4)假定了C后,在满足1)中的规律前提下,A或B肯定会被假定出来一个(为了描述方便,A被假定出来),然后再去循环B。再找B的时候,数组中最小的数 + A <= C && 数组中最大的数(排除A和C,以及被否定掉的C) + A >= C.满足这个条件在进行折半查找,不满足,则查找小于刚才假定的C,然后重复4,直到找出来为止
qjx1984 2008-07-25
  • 打赏
  • 举报
回复
我这水平顶多也就是个实现 还没能力考虑运行的快步快 学习 学习
phper530 2008-07-09
  • 打赏
  • 举报
回复
经典,很不错!!经典,很不错!!
加载更多回复(322)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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