# LeetCode 1007 行相等的最少多米诺旋转

LeetCode 1007 行相等的最少多米诺旋转

原题英文:Minimum Domino Rotations For Equal Row

难度:中等 | 标签:数组、贪心


1 题目重述

给定两行长度相同的多米诺骨牌:

  • tops[i] 表示第 i 张骨牌上面的数字;
  • bottoms[i] 表示第 i 张骨牌下面的数字。

你可以任选一些骨牌把它们翻转(即交换这一张牌的上下数字)。

请返回 最少需要翻转多少次 ,才能让 上面一行全部相等 或 下面一行全部相等 。

如果无论怎么翻也做不到,返回 -1。


2 解题思路

2.1 关键观察

  1. 候选数字只有 2 个

    假设最终能让某一行全部等于 x,那么 x 必定出现在第一张牌的上面或下面。

    因此我们只需要检验 tops[0] 和 bottoms[0] 这两个数字即可。

  2. 一次扫描即可统计旋转次数

    对于候选数 x,我们同时统计:

    • rotateTop ------让 上排 都变成 x 需要翻多少次;
    • rotateBottom ------让 下排 都变成 x 需要翻多少次。
      遍历时若发现某张牌两面都不是 x,说明 x 不可能完成统一,直接失败即可。
  3. 答案 = 这两个候选数字的最小可行翻转数

    若两个候选都失败,则返回 -1。

2.2 时间复杂度

我们只扫描两遍数组,时间 O(n) ,空间 O(1)。


3 常见坑点

坑 说明
把整条数组与数字比较 bottoms == b 永远为 False,正确写法应为 bottoms[i] == b
忘记处理 0 次翻转 if tmp: 会把 tmp == 0 的有效解过滤掉,应直接比较最小值
发现失败仍更新答案 一旦遇到两面都不是候选数,应立即 return 而不是继续用临时统计结果更新全局答案

4 AC 代码(Python 3)

python 复制代码
from typing import List

class Solution:
    def minDominoRotations(self, tops: List[int], bottoms: List[int]) -> int:
        def check(x: int) -> int:
            """ 返回让某一行全变成 x 的最小翻转数;若不可行返回 inf """
            rot_top = rot_bot = 0
            for t, b in zip(tops, bottoms):
                if t != x and b != x:      # 这张牌两面都不是 x,不可行
                    return float('inf')
                if t != x:                 # 让上排 = x 需翻一次
                    rot_top += 1
                if b != x:                 # 让下排 = x 需翻一次
                    rot_bot += 1
            return min(rot_top, rot_bot)

        cand = {tops[0], bottoms[0]}        # 只需检验这两个数
        ans = min(check(c) for c in cand)
        return -1 if ans == float('inf') else ans

5 个人踩坑记录

原始尝试(WA 78/84):

python 复制代码
elif bottoms==b:   # 我把整个列表跟数字比了
  • Bug 1:比较对象写错导致第二个候选数统计永远失效。
  • Bug 2 :遇到失败只把 tmp 置零然后 break,后面依旧用它去更新答案,错误写入了 res。
  • Bug 3 :if tmp: 把 0 次翻转的情况漏掉。

修改这三处后一次 AC。


6 总结

  • 看到"让整行相等"这类题,第一步先想 "候选值能否极度缩小";本题直接锁定两种数字。
  • 写多分支判断时务必小心 索引 vs 整体,这是数组题最易犯的错。
  • 当循环里一旦出现 判定失败条件 ,应及时 return,不要让无效结果继续污染后续逻辑。

感谢阅读,祝早日 AK LeetCode!
By @迪小莫学AI

复制代码
相关推荐
第九序言T1 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路1 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003962 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_2 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
quantdash_cc3 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl3 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Pniubi3 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
BIBI20493 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践
云和数据.ChenGuang4 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
chushiyunen4 小时前
autoHotKey、windows自动化快捷键工具
运维·windows·自动化