算法题28 配对比较---有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来 - 在水一方 - 博客频道 - CSDN.NET



算法题28 配对比较---有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来 - 在水一方 - 博客频道 - CSDN.NET

解题思路:此题就是需找两个可比较数列的问题。如果直接比较的话,那就是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[nodemap[di]])匹配成功,否则插入节点(di, i).


Read full article from 算法题28 配对比较---有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样,把配对的石头和木头找出来 - 在水一方 - 博客频道 - CSDN.NET


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts