【Leetcode 每日一题 - 补卡】1007. 行相等的最少多米诺旋转

发布于:2025-05-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

问题背景

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

数据约束

  • 2 ≤ t o p s . l e n g t h ≤ 2 × 1 0 4 2 \le tops.length \le 2 \times 10 ^ 4 2tops.length2×104
  • b o t t o m s . l e n g t h = t o p s . l e n g t h bottoms.length = tops.length bottoms.length=tops.length
  • 1 ≤ t o p s [ i ] , b o t t o m s [ i ] ≤ 6 1 \le tops[i], bottoms[i] \le 6 1tops[i],bottoms[i]6

解题过程

结果要求所有元素都相同,那这意味着如果最后能实现,那么取初始状态的任意一个元素,它或它的翻转状态一定被包含在结果中。
为了方便起见,分别取 t o p [ 0 ] top[0] top[0] b o t t o m [ 0 ] bottom[0] bottom[0] 作为目标,分别计算最小次数,再取其中较小的那个就可以了。

具体实现

class Solution {
    public int minDominoRotations(int[] tops, int[] bottoms) {
        int res = Math.min(minRot(tops, bottoms, tops[0]), minRot(tops, bottoms, bottoms[0]));
        return res == Integer.MAX_VALUE ? -1 : res;
    }

    private int minRot(int[] tops, int[] bottoms, int target) {
        int toTop = 0;
        int toBottom = 0;
        for (int i = 0; i < tops.length; i++) {
            int x = tops[i];
            int y = bottoms[i];
            if (x != target && y != target) {
                return Integer.MAX_VALUE;
            }
            if (x != target) {
                toTop++; 
            } else if (y != target) {
                toBottom++;
            }
        }
        return Math.min(toTop, toBottom);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到