【LeetCode竞赛题】1007. 行相等的最少多米诺旋转(在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。)

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值