算法题28 配对比较---有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来

题目1:有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来

 

题目2:有一堆螺栓和螺母,每一个螺栓只可能配一个螺母,螺栓与螺栓之间不能比较,螺母与螺母之间也不可以比较,只有螺栓与螺母之间可以比较,配对所有的螺栓和螺母。

 

解题思路:此题就是需找两个可比较数列的问题。如果直接比较的话,那就是O(n^2)的复杂度。

 

设a[1...n],b[1...n]为两个序列。那么可以新建这样的两个实数数列

c[1...n], cn = bn - a1

d[1...n], dn = an - b1+c1 = an-a1.

 

由题意知,cn中没有重复的值,dn中也没有重复的值。

 

因此问题转化为求两个实数数列cn和dn中的值相等的数对。

 

可采用并查集的思路来解决这个问题:时间复杂度O(n),空间复杂度O(n)

 

算法:

1)建立一个hashmap表--nodemap,如STL中的map,C#中的Dictionary,key为ci,value为计算ci时bi在b中的索引或计算的di在a中的索引。

2) for i = 1 to n 计算ci = bi-a1,如果ci在nodemap中,这数对(a[nodemap[ci]], b[i]),配对成功,否则nodemap中插入节点(ci, i)

计算di = (ai-b1)+(b1-a1),如果di在nodemap中,则数对(a[i], b[nod

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值