找出数组中和为N的所有配对

[i][size=small]有一个集合a,里面有n个正整数,乱序排列。给定一个正整数N,求,a中任意两个数相加等于N,共有哪些种组合情况。例如,集合为{1,3,44,2,4,5,54,222,368} N=6,则结果集为{1,5},{2,4} [/size][/i]

[size=medium]我的思路,
[list]
1. 用N减去每个元素得到另一个数组b,[b]嵌套循环[/b]找到a与b中值相同而位置不同的元素对;空间复杂度2N,时间复杂度O(N^2)。


2. 将a按照[b]升序排序[/b],初始化变量max_loc=N-1,从最小值a[i=0]开始遍历,
a. 若max_loc<=i,结束程序,否则进入b;
b. 判断a[max_loc] + a[i]与N大小关系;<N则continue对a[i]的遍历;=N则输出这对数,max_loc--,继续b;>N则max_loc--,继续b;
该方法的空间复杂度是1,时间复杂度是O(NlgN+N),证明如下:
排序的复杂度视为NlgN,后面配对的部分复杂一点,循环第i个值的复杂度用f(i)表示,有如下的关系,f(0)<N,f(1)<N-f(0),这是因为a[0]遍历走过的那部分最大值不需要在a[1]的循环里再去检验了,所以有[b]f(i)<N-[f(0)+...+f(i-1)][/b],进而得到f(0)+f(1)+...+f(N-1)<N,所以说整个算法的复杂度是O(NlgN+N)。

欢迎讨论和拍砖!!
[/list][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值