一、题目描述:
在一排多米诺骨牌中,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,如图二所示。
二、思路分析:
- 从结果倒推过程。
- 若是能成功那么结果数组必然要么全部为A[0]或者B[0],因此将有四种可能性:
- 1.以数组A为基准,将数组A中的数字全部替换为A[0]
- 2.以数组A为基准,将数组A中的数字全部替换为B[0]
- 3.以数组B为基准,将数组A中的数字全部替换为A[0]
- 4.以数组B为基准,将数组A中的数字全部替换为B[0]
三、AC 代码:
/**
* @param {number[]} A
* @param {number[]} B
* @return {number}
*/
var minDominoRotations = function(A, B) {
let res = Math.min(
rotation(A[0],A,B),
rotation(B[0],A,B),
rotation(A[0],B,A),
rotation(B[0],B,A),
)
return res === Number.MAX_SAFE_INTEGER ? -1 : res
function rotation(benchmark,arrA,arrB){
let counter = 0
for(let i=0;i<arrA.length;i++){
if(benchmark === arrA[i]){
continue
}else{
if(benchmark === arrB[i]){
counter++
}else{
return Number.MAX_SAFE_INTEGER
}
}
}
return counter
}
};
四、总结:
当正向思考不清晰的时候,不妨由结果倒推过程,可降低思考的复杂度。