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行,进行最小次数判断。

posted on 2019-03-10 21:30  Sempron2800+  阅读(128)  评论(0编辑  收藏  举报