1 public class Solution 2 { 3 public int MinDominoRotations(int[] A, int[] B) 4 { 5 var na = A.Length; 6 var nb = B.Length; 7 if (na != nb) 8 { 9 return -1; 10 } 11 var dic1 = new Dictionary<int, List<int>>(); 12 var dic2 = new Dictionary<int, List<int>>(); 13 for (var i = 1; i <= 6; i++) 14 { 15 dic1.Add(i, new List<int>()); 16 dic2.Add(i, new List<int>()); 17 } 18 19 for (var i = 0; i < na; i++) 20 { 21 var a = A[i]; 22 dic1[a].Add(i); 23 24 var b = B[i]; 25 dic2[b].Add(i); 26 } 27 28 var minchanges = na; 29 var find = false; 30 for (var i = 1; i <= 6; i++) 31 { 32 var top = dic1[i]; 33 var bottom = dic2[i]; 34 var temp = top.Union(bottom).Distinct(); 35 if (temp.Count() == na) 36 { 37 minchanges = Math.Min(minchanges, na - Math.Max(top.Count(), bottom.Count())); 38 find = true; 39 } 40 } 41 return find ? minchanges : -1; 42 } 43 }
思路,分别记录上部和下部的每一个点数出现的索引,然后对以此判断每一个点数的并集,是否包含了全部的索引。
这样的点数,就是可以满足在同一侧全是一样的点数。
下面就要找最小的移动次数,发现最小的移动次数是保持这个点数出现的次数多的一面不动,而把这个点数出现在另一面的牌进行翻转。
如代码所示:34行,求并集。37行,进行最小次数判断。