Minimum Domino Rotations For Equal Row LT1007
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domino is a tile with two numbers from 1 to 6 - one on each half of the tile.)
We may rotate the i-th domino, so that A[i] and B[i] swap values.
Return the minimum number of rotations so that all the values in A are the same, or all the values in B are the same.
If it cannot be done, return -1.
Example 1:

Input: A = [2,1,2,4,2,2], B = [5,2,6,2,3,2]
Output: 2
Explanation:
The first figure represents the dominoes as given by A and B: before we do any rotations.
If we rotate the second and fourth dominoes, we can make every value in the top row equal to 2, as indicated by the second figure.
Example 2:
Input: A = [3,5,1,2,3], B = [3,6,3,3,4]
Output: -1
Explanation:
In this case, it is not possible to rotate the dominoes to make one row of values equal.
Idea 1. Bruteforce, swap or not swap(0-1), similar to subsets problem, typical backtracking
Time complexity: O(n2^n)
Space complexity: O(1)
class Solution {
private void swap(int[] A, int[] B, int pos) {
int temp = A[pos];
A[pos] = B[pos];
B[pos] = temp;
}
private boolean isEqual(int[] A) {
for(int i = 1; i < A.length; ++i) {
if(A[i] != A[i-1]) {
return false;
}
}
return true;
}
private void helper(int[] A, int[] B, int pos, int currCnt, int[] cnt) {
if(pos == A.length) {
if(isEqual(A) || isEqual(B)) {
cnt[0] = Math.min(cnt[0], currCnt);
}
return;
}
if(A[pos] != B[pos]) {
swap(A, B, pos);
helper(A, B, pos+1, currCnt+1, cnt);
swap(A, B, pos);
}
helper(A, B, pos+1, currCnt, cnt);
}
public int minDominoRotations(int[] A, int[] B) {
int[] cnt = new int[1];
cnt[0] = Integer.MAX_VALUE;
helper(A, B, 0, 0, cnt);
return cnt[0] == Integer.MAX_VALUE? -1: cnt[0];
}
}
Idea 2. 有时候具体的题目要求更restrict, 反而简化了问题,这题要求all elments equal in A[i] or B[i], 如果我们知道交换后的结果数组的相同数,只能是四种:A-> { A[0], B[0] }, B-> { A[0], B[0] },
make A be all A[0] or B[0]
make B be all A[0] or B[0]
然后计算最小步数
Time complexity: O(n), 4 times scan
Space complexity: O(1)
class Solution {
int helper(int[] A, int[] B, int target) {
int cnt = 0;
for(int i = 0; i < A.length; ++i) {
if(A[i] != target) {
if(B[i] == target) {
++cnt;
}
else {
return Integer.MAX_VALUE;
}
}
}
return cnt;
}
public int minDominoRotations(int[] A, int[] B) {
int result = Math.min(helper(A, B, A[0]),
helper(A, B, B[0]));
result = Math.min(result,
Math.min(helper(B,A, B[0]),
helper(B, A, A[0])));
return result == Integer.MAX_VALUE? -1: result;
}
}
Idea 2.a 网上看到的,一次遍历同时计算A,B所需的步数
Time complexity: O(n), 2 times scan
Space comlexity: O(1)
class Solution {
private int helper(int[] A, int[] B, int target) {
int swapA = 0, swapB = 0;
for(int i = 0; i < A.length; ++i) {
if(A[i] != target && B[i] != target) {
return Integer.MAX_VALUE;
}
if(A[i] != target){
++swapA;
}
else if(B[i] != target) {
++swapB;
}
}
return Math.min(swapA, swapB);
}
public int minDominoRotations(int[] A, int[] B) {
int result = Math.min(helper(A, B, A[0]),
helper(A, B, B[0]));
return result == Integer.MAX_VALUE? -1: result;
}
}
Idea 3. intersection set of {A{i}, B{i}}, 为了完成swap可以让数组相等,each position in either A or B should have the element, we can use set.retailAll, the steps = A.length - countA[A[i]]
Time complexity: O(n)
Space complexity: O(1), HashMap + HashSet
class Solution {
public int minDominoRotations(int[] A, int[] B) {
Set<Integer> candidates = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
int[] countA = new int[7];
int[] countB = new int[7];
for(int i = 0; i < A.length; ++i) {
++countA[A[i]];
++countB[B[i]];
candidates.retainAll(new HashSet<>(Arrays.asList(A[i], B[i])));
}
for(int val: candidates) {
return Math.min(A.length - countA[val], A.length - countB[val]);
}
return -1;
}
}
用数组代表set
class Solution {
public int minDominoRotations(int[] A, int[] B) {
int[] countA = new int[7];
int[] countB = new int[7];
int[] common = new int[7];
for(int i = 0; i < A.length; ++i) {
++countA[A[i]];
++countB[B[i]];
if(A[i] == B[i]) {
++common[A[i]];
}
}
for(int i = 1; i < 7; ++i) {
if(countA[i] + countB[i] - common[i] >= A.length) {
return Math.min(A.length - countA[i], A.length - countB[i]);
}
}
return -1;
}
}
Minimum Domino Rotations For Equal Row LT1007的更多相关文章
- [Swift]LeetCode1007. 行相等的最少多米诺旋转 | Minimum Domino Rotations For Equal Row
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domi ...
- 1007. Minimum Domino Rotations For Equal Row
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domi ...
- Leetcode: Minimum Domino Rotations For Equal Row
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domin ...
- 【leetcode】1007. Minimum Domino Rotations For Equal Row
题目如下: In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. ( ...
- 【LeetCode】1007. Minimum Domino Rotations For Equal Row 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历一遍 日期 题目地址:https://leetc ...
- [LC] 1007. Minimum Domino Rotations For Equal Row
In a row of dominoes, A[i] and B[i] represent the top and bottom halves of the i-th domino. (A domi ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)
Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...
- [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)
Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...
随机推荐
- Linux系统目录权限chmod误操作权限修复方法
Linux中,如果意外误操作将/目录权限批量设置,比如chmod -R 777 / ,系统中的大部分服务以及命令将无法使用,这时候可以通过系统自带的getfacl命令来拷贝和还原系统权限,若是其他系统 ...
- Ubuntu 14.10 下Hive配置
1 系统环境 Ubuntu 14.10 JDK-7 Hadoop 2.6.0 2 安装步骤 2.1 下载Hive 我第一次安装的时候,下载的是Hive-1.2.1,配置好之后,总是报错 [ERROR] ...
- sizeof的用法
因为对sizeof不是很了解,所以去查了博客啥的,发现还是有大学问的,以下对其用法进行总结. 参考:https://www.cnblogs.com/zhangyz/articles/4736758.h ...
- Linux 实时查看tomcat 日志--less命令
查看tomcat日志通常用 tail -n 或者 tail -f 或者grep 或者 vi cat等命令去查看异常信息,但是日志是在不停地刷屏,tail是动态的在变的,我们往往期望从日志最后一行往前 ...
- nginx 返回数据不完整
当nginx 代理解析大量数据流时,会把数据先放在自己的缓冲区,然后一并发给客户端 一次请求的数据量很大, 则会有一部分数据会被忽略掉 前端解析数据会有问题 致使页面白屏 nginx 返回数据不完整的 ...
- http 文件上传协议图览
- python3 pyinstaller生成exe文件过程问题解决记录
1.使用pip安装pyinstaller 2.在cmd打开需生成可执行文件的python文件所在文件夹 3.使用命令pyinstaller -F -w **.py (代码中有import其他模块的,只 ...
- shell数组的使用
定义: array=(1 2 3) echo ${array[0]} echo ${array[1]} echo ${array[2]} echo ${array[*]} 所有元素 echo $ ...
- SQLite在Android程序中的使用方法,SQLite的增删查改方法
Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...
- DOCKER解析(转)
Docker基本概念详解 本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令. 阅读本文大概需要15分钟,通过阅读本文你将知道一下 ...