[LeetCode1007. 行相等的最少多米诺旋转] | 刷题打卡

201 阅读2分钟

一、题目描述:

leetcode-cn.com/problems/ma…

在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。)
我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。
返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。
如果无法做到,返回 -1.

****示例 1:

domino.png

输入:A = [2,1,2,4,2,2], B = [5,2,6,2,3,2]
输出:2
解释:
图一表示:在我们旋转之前, AB 给出的多米诺牌。
如果我们旋转第二个和第四个多米诺骨牌,我们可以使上面一行中的每个值都等于 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
    }
};

四、总结:

当正向思考不清晰的时候,不妨由结果倒推过程,可降低思考的复杂度。