1007. 行相等的最少多米诺旋转
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/minimum-domino-rotations-for-equal-row/
解题思路:
如果能使A中或者B中所有值都相等,比如都为该值x,那么必然在A[0]或B[0]中至少也存在一个x。
于是对于该问题,我们只需要考虑以A[0]、B[0]这两个数为基准,查找后面每个A[i]、B[i]元素中是否存在与A[0]、B[0]相等。例如以A[0]为基准,若A[i]、B[i]都不与基准相等,直接返回-1;否则将A数组全都变为A[0]或者B数组全都变为A[0]。这样得到两个旋转次数,选其中的小者即可。
public int minDominoRotations(int[] A, int[] B) {
int n = A.length;
int count_A = 0;
int count_B = 0;
int flag_AB = 0;
// 先以A[0]为基准
for (int i = 0; i < n; i++) {
if (A[i] != A[0] && B[i] != A[0]) {
flag_AB = 1;
break;
} else if (B[i] != A[0]) {
count_B++;
} else if (A[i] != A[0]) {
count_A++;
}
}
// 只要A数组或B数组都为A[0],则不需要再去判断B[0]。
// 因为当A数组、B数组的元数都相同时(无论A[0]是否与B[0]相等),最小旋转次数是一样的。
if (flag_AB != 1) {
return Math.min(count_A, count_B);
}
// 当A[0]不满足要求时,并且B[0]等于A[0],则直接返回-1,否则再以B[0]为基准继续判断。
else if (flag_AB == 1 && A[0] == B[0]){
return -1;
}
count_A = 0;
count_B = 0;
flag_AB = 0;
// 先以B[0]为基准
for (int i = 0; i < n; i++) {
if (A[i] != B[0] && B[i] != B[0]) {
flag_AB = 1;
break;
} else if (B[i] != B[0]) {
count_B++;
} else if (A[i] != B[0]) {
count_A++;
}
}
if (flag_AB != 1) {
return Math.min(count_A, count_B);
} else {
return -1;
}
}