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 ...
随机推荐
- TCP/IP学习20180629-数据链路层-ARP、IP
1.数据链路层:IP.ARP.RARPARP协议用来找到目标主机的Ethernet网卡Mac地址,IP协议用来承载数据ARP协议找到目标,IP协议传输数据2.IP协议ip协议是TCP/IP协议的核心, ...
- C++ Programming Language中的narrow_cast实现
在C++中,各种数值类型的转化是C++编译过程中警告的主要来源,但是,很多时候,我们需要使用各种数值类型,例如我们用数组的某一位表示大小为对应序号的值,这种情况下,经常会涉及多种数值类型.根据C++ ...
- 输入框UITextField禁止输入空格方法
方法一:添加代理 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range rep ...
- Js将数字转化为中文大写
function number_chinese(str) { var num = parseFloat(str); var strOutput = "", strUnit = '仟 ...
- 涂抹mysql笔记-搭建mysql高可用体系
mysql的高可用体系<>追求更高稳定性的服务体系 可扩展性:横向扩展(增加节点).纵向扩展(增加节点的硬件配置) 高可用性<>Slave+LVS+Keepalived实现高可 ...
- 常见的php模式
php中6种常见的设计模式 单例模式 观察者模式 策略模式 工厂模式 注册模式 适配器模式 单例模式 Db.php<?php /** * 单例模式 */ class Db { private s ...
- nodejs模块循环引用讲解
CommonJS 模块的重要特性是加载时执行,即脚本代码在require的时候,就会全部执行.一旦出现某个模块被"循环加载",就只输出已经执行的部分,还未执行的部分不会输出. 让我 ...
- ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []
[1]问题背景:Oracle数据库版本为11.2.0.1,操作系统CentOS release 5.9,详细的报错信息如下: Dump file /data/oracle/diag/rdbms/db0 ...
- 【函数】isinstance内建函数(小窗help)
#学到了第八天,还有很多没有理解,不过,没关系,相信任何复杂的问题都是由简单的组成,只有将每一个细节理解到位,自然问题迎刃而解 今天遇到了isinstace函数,忘了,先看一下语法 查百度附上链接:h ...
- python 一些方法函数
转Python学习笔记十一:列表(3)--列表的一些方法:http://www.cnblogs.com/dabiao/archive/2010/03/12/1683942.html python中的e ...