1007. 行相等的最少多米诺旋转
在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。)
我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。
返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。
如果无法做到,返回 -1.
示例 1:
输入:A = [2,1,2,4,2,2], B = [5,2,6,2,3,2] 输出:2 解释: 图一表示:在我们旋转之前, A 和 B 给出的多米诺牌。 如果我们旋转第二个和第四个多米诺骨牌,我们可以使上面一行中的每个值都等于 2,如图二所示。
示例 2:
输入:A = [3,5,1,2,3], B = [3,6,3,3,4] 输出:-1 解释: 在这种情况下,不可能旋转多米诺牌使一行的值相等。
提示:
1 <= A[i], B[i] <= 6
2 <= A.length == B.length <= 20000
分析:
分析题可以发现,牌的倒向方式有两种,一种是遍历A,B中遇到相同的倒向A,一种是遍历B,A中遇到相同的倒向B,将倒向的过程封装成一个方法,
在swingToA(int[]A, int[]B)方法中,用temp存出现元素的个数,索引+1代表出现的数字,此索引下的内容代表这个数字出现的次数,
遍历A中的数组,若发现已经在前面出现过(由于有数组temp,可以直接查找相对应的索引),就跳过这个数,
没有出现过,指针j就同时遍历A、B数组,同时计数B倒向A的个数(d)和倒向A后此数的个数(count),
若count等于A.length,就返回d,不等于就到下一个数,同样是如上操作。
遍历完毕还是没能使A中的数都相同,就返回-1.
在minDominoRotations(int[] A, int[] B)方法中,两次调用,返回A倒向B和B倒向A的最小值。
代码:
public class LeetcodeTest {
public static void main(String[] args) {
Solution So = new Solution();
int[] A = {2,1,2,4,2,2};
int[] B = {5,2,6,2,3,2};
System.out.println(So.minDominoRotations(A, B));
}
}
class Solution {
public int minDominoRotations(int[] A, int[] B) {
int a = swingToA(A, B);
int b = swingToA(B, A);
return Math.min(a, b);
}
private int swingToA(int[]A, int[]B){
int[] temp = new int[6];
for(int i=0; i<A.length; i++){
if(temp[A[i]-1] == 0){
temp[A[i]-1] = 1;
int count = 1;
int d = 0;
for(int j=0; j<B.length; j++){
if(j!=i){
if((A[j] == A[i]) || (B[j] == A[i])){
count++;
}
if((B[j] == A[i]) && (A[j] != A[i])){
d++;
}
}
}
if(count == A.length){
return d;
}
}
}
return -1;
}
}