news 2026/7/6 8:14:02

力扣1007:多米诺旋转最少次数解法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣1007:多米诺旋转最少次数解法

LeetCode 1007. 行相等的最少多米诺旋转要求:给定两个长度相等的数组topsbottoms,分别代表一排多米诺骨牌的顶部和底部数字。一次旋转可以将一个多米诺骨牌的顶部数字翻到底部,或者底部翻到顶部。目标是找到最少的旋转次数,使得所有多米诺骨牌的顶部数字全部相同,或者所有底部数字全部相同。如果无法达成,则返回-1

核心思路是,最终能使一行相等的数字target只能是tops[0]bottoms[0]中的一个(因为必须包含第一个骨牌的某个面)。因此,只需检查这两个候选数字,并分别计算使顶部全为target或底部全为target所需的最小旋转次数,取最小值即可。

算法步骤

1.定义辅助函数check(target),计算使顶部或底部全变为target所需的最小旋转次数。
2. 分别以tops[0]bottoms[0]作为候选target进行检查。
3. 对于每个target
* 初始化rotations_toprotations_bottom为0,分别表示使顶部全为target和使底部全为target所需的旋转次数。
* 遍历每个骨牌i
* 如果tops[i]bottoms[i]都不等于target,则该target不可能使任何一行相等,返回INT_MAX表示失败。
* 如果tops[i] != target,则要使顶部全为target,必须旋转此骨牌,rotations_top++
* 如果bottoms[i] != target,则要使底部全为target,必须旋转此骨牌,rotations_bottom++
* 返回min(rotations_top, rotations_bottom),即对于此target的最小旋转次数。
4. 对两个候选target得到的结果取最小值。如果结果仍为INT_MAX,则返回-1,否则返回该最小值。

C++ 代码实现

#include <vector> #include <algorithm> #include <climits> using namespace std; class Solution { public: int minDominoRotations(vector<int>& tops, vector<int>& bottoms) { int n = tops.size(); // 辅助函数:计算使一行全为 target 的最小旋转次数 auto check = [&](int target) -> int { int rotations_top = 0; // 使顶部全为 target 的旋转次数 int rotations_bottom = 0; // 使底部全为 target 的旋转次数 for (int i = 0; i < n; ++i) { // 如果当前骨牌的两个面都不等于 target,则不可能 if (tops[i] != target && bottoms[i] != target) { return INT_MAX; } // 如果顶部不是 target,则需要旋转一次才能使顶部是 target if (tops[i] != target) { rotations_top++; } // 如果底部不是 target,则需要旋转一次才能使底部是 target if (bottoms[i] != target) { rotations_bottom++; } } // 返回两种方案中旋转次数较少的 return min(rotations_top, rotations_bottom); }; // 候选目标只能是第一个骨牌的顶部或底部数字 int ans = min(check(tops[0]), check(bottoms[0])); return ans == INT_MAX ? -1 : ans; } };

复杂度分析

维度结果说明
时间复杂度O(N)遍历数组两次(检查两个候选数字),每次 O(N)。
空间复杂度O(1)只使用了常数个额外变量。

关键点解析

  • 候选数字的有限性:由于必须翻转整个行,且第一个骨牌必然参与,所以最终统一的数字只能是tops[0]bottoms[0]。这是将问题简化为两次线性检查的关键 。
  • 贪心检查:在检查一个候选数字target时,对于每个骨牌,只要其中一个面等于target即可,无需选择旋转哪个面。我们分别统计使顶部全为 target使底部全为 target所需的旋转次数,最后取最小值。这是因为对于每个骨牌,如果tops[i] == targetbottoms[i] == target,则无论最终目标是统一顶部还是底部,这个骨牌都不需要旋转。
  • 无法完成的条件:如果在检查某个target时,遇到一个骨牌的两个面都不等于target,则该target不可能完成任务 。

参考来源

  • LeetCode 1007. 行相等的最少多米诺旋转 C++描述
  • 1007 素数对猜想 题目解析、代码、素数的判断 PTAbasic 浙大C++
  • LeetCode刷题|贪心算法|#1007 、行相等的最少多米诺旋转
  • 1007. Minimum Domino Rotations For Equal Row
  • Leetcode 1007. 行相等的最少多米诺旋转
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 8:13:10

每日 AI 热点:Claude Sonnet 5 上线后,团队更该先稳住统一接入层

每日 AI 热点&#xff1a;Claude Sonnet 5 上线后&#xff0c;团队更该先稳住统一接入层2026 年 7 月 5 日&#xff0c;北京时间今天&#xff0c;开发者圈还在持续讨论一组值得追踪的 AI 动态。 先是 Anthropic 在 2026 年 6 月 30 日发布 Claude Sonnet 5&#xff0c;把新一代…

作者头像 李华
网站建设 2026/7/6 8:05:51

硬件是骨, AI 是魂,数据让二者成为一体

数据一旦转不起来&#xff0c;AI 也许依然难以摆脱困于房间的宿命&#xff0c;而硬件也可能只是包裹了一层科技糖衣的漂亮外壳。 这两年聊 AI 硬件&#xff0c;大家习惯问一个问题&#xff1a;到底是硬件公司在做 AI&#xff0c;还是 AI 公司在做硬件&#xff1f; 这个分法抓…

作者头像 李华
网站建设 2026/7/6 8:05:48

在Windows上轻松安装APK文件:APK安装器完全指南

在Windows上轻松安装APK文件&#xff1a;APK安装器完全指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行安卓应用&#xff0c;却对…

作者头像 李华
网站建设 2026/7/6 8:05:42

大模型 Function Calling 深度解析:从原理到商用智能体实战

Function Calling 是连接大模型与物理世界的关键桥梁——它赋予语言模型行动能力,让模型能够调用外部工具、API 和数据库,突破自身的知识截止与计算局限。本文将从核心概念、技术原理、最佳实践到业界商用智能体的深度应用,全方位讲解 Function Calling,帮助你从“会聊天的…

作者头像 李华
网站建设 2026/7/6 8:05:26

达摩院ElementsClaw深度解析:AI智能体如何用28GPU小时发现4种全新超导材料

摘要:2026年7月3日,阿里达摩院联合中国人民大学、中国科学院大学发布了全球首个超导材料发现AI智能体ElementsClaw。仅用28个GPU小时从240万晶体结构中筛选出6.8万超导候选材料,其中4种全新超导体已实验验证。本文从技术架构、模型设计、智能体框架、发现路径四个维度展开深…

作者头像 李华
网站建设 2026/7/6 8:03:13

openEuler agent-skills API参考手册:全面掌握技能调用接口

openEuler agent-skills API参考手册&#xff1a;全面掌握技能调用接口 【免费下载链接】agent-skills Agent skills made by openEuler community to provide a smooth vibe coding experience for developers. 项目地址: https://gitcode.com/openeuler/agent-skills …

作者头像 李华