判断集合中是否有两个数的和等于某个给定整数

给定一个整数的集合S, 有一个整数x,判断S中是否有两个数相加等于x.

解法1《算法导论》

解题步骤:

1.        对数组S进行归并排序。

2.        构造数组S’={z : z=x-y, y∈S},并排序。由于S已经有序,构造与排序可一并完成。

3.        删除S中重复的元素使仅保留一个,对S’进行同样的操作。

4.        合并SS’,并保证合并后有序,这里可以使用归并排序的思想。

5.        如果在合并后的数组中存在连续两个相同的元素,并且这种元素的个数大于1,那么有解。

设想在合并后的数组中存在连续两个w,则w分别属于SS’,那么S中存在y使得w=x-y,即x=y+w。因此,S中元素wy的和为x

步骤1的运行时间为Θ(n lg n),其余步骤运行时间为Θ(n),因此总的时间代价为Θ(n lg n)


解法2:

对S排个序O(nlgn),然后用两个指针p1,p2分别指向头尾,

if(p1+p2 == x)
  return true;
else if(p1 + p2 > x)
  p2--;
else
  p1++;

直到2指针相遇,如果没有找到,返回false

注:感觉是对的,但是如何证明呢?真的没有漏洞吗知道的请给我留言

解法3

如果x不大的话.

申请x大小的数组byte t[x],memset 0.

遍历下集合S,对于小于x的数i将t[i]=1; 这是0(N);

然后对数组t[x]遍历. 循环查找i对应的t[x-i]是否为1. 这是O(X)


后记:

同样道理,找三个数之和也可以在n^2时间内完成。
sum=a[i]+b[i]+c[i];
等价找两个数其和为s=sum-a[i];
共有n个,每个查找为线性时间n;
nlgn+n^2=n^2。

转载于:https://www.cnblogs.com/freewater/archive/2011/09/01/2162417.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD工作方式如下:给定整数组,想要找出这个数同时出现的整数。我们可以使用哈希集合来解决此问题。 首先,我们创建一个空的哈希集合。然后,遍历第一个整数组,将其的每个整数都添加到哈希集合。接下来,我们遍历第二个整数组,对于每个元素,判断是否在哈希集合。如果在集合,说明这个整数是同时出现在个数一个整数。 具体的步骤如下: 1. 创建一个空的哈希集合。 2. 遍历第一个整数组,将其的每个整数都添加到哈希集合。 3. 创建一个空的结果组,用来存储同时出现的整数。 4. 遍历第二个整数组,对于每个元素,判断是否在哈希集合。 - 如果在集合,将这个整数添加到结果。 5. 返回结果组。 下面是一个示例代码: ```python def find_common_integers(nums1, nums2): # 创建哈希集合 hash_set = set() # 遍历第一个整数组,将其的每个整数添加到哈希集合 for num in nums1: hash_set.add(num) # 创建结果组 result = [] # 遍历第二个整数组,对于每个元素,判断是否在哈希集合 for num in nums2: # 如果在集合,将这个整数添加到结果 if num in hash_set: result.append(num) # 返回结果组 return result ``` 通过以上步骤和代码,我们可以找出整数同时出现的整数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值