算法:
1.将所有up组左右对换转换为down,并统计down的组数,记做n。 此时三个输入仅可能有even和down两种情况。
2.even中的元素为真硬币。将所有down中元素为真硬币的去掉。
3.down中的同一侧出现的次数为n的元素则为假硬币,并通过假硬币在左侧或是右侧判断heavy or light。
该算法的一种代码实现如下:
一、初始化:ans[12]所有元素为1. A+'i'对应ans[i]
二、3组测量过程,对每一组[left[m],right[m],state],执行以下操作:
若state为even,
对left中每个元素left[i]对应的ans[left[i]-’A']乘上0. 即ans[left[i]-’A']*=0
同理,right中每个元素对应的ans也乘上0
若state为down
对left中每个元素对应的ans乘上2
right中每个元素对应的ans乘上3
若state为up
对left中每个元素对应的ans乘上3
right中每个元素对应的ans乘上2
三、最后遍历ans数组,若有元素等于2^n,则该元素为假硬币且重;
若有元素等于3^n,则该元素为假硬币且轻;(n为3组里非even的组数,即天平不平衡的次数)
由于每个case必有唯一解,因此步骤三必定能找到一个且仅有一个假硬币。