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的更多相关文章

  1. [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 ...

  2. 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 ...

  3. 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 ...

  4. 【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.  ( ...

  5. 【LeetCode】1007. Minimum Domino Rotations For Equal Row 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历一遍 日期 题目地址:https://leetc ...

  6. [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 ...

  7. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  8. 【Leetcode周赛】从contest-121开始。(一般是10个contest写一篇文章)

    Contest 121 (题号981-984)(2019年1月27日) 链接:https://leetcode.com/contest/weekly-contest-121 总结:2019年2月22日 ...

  9. [ACM_图论] Domino Effect (POJ1135 Dijkstra算法 SSSP 单源最短路算法 中等 模板)

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

随机推荐

  1. git 更新远程分支列表

    git remote update origin --prune git remote update origin -p

  2. Java中的内存泄露的几种可能

    Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周期的对象持有短生命周期对象的引用就很可能发 ...

  3. centos7-软件安装-jdk1.8

    JDK1.8下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装目录 ...

  4. Web jsp开发学习——网上直播聊天室的简单开发

    整个界面为chat.jsp: 如果用户没有登录,就不能进行聊天. 为将发言的句子传到页面上,要设置一个<iframe></iframe>虚拟框架,将allmessage.jsp ...

  5. CSS之form&span

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 63.(原65)纯 CSS 创作一个摇摇晃晃的 loader

    原文地址:https://segmentfault.com/a/1190000015424389 修改后地址:https://scrimba.com/c/cqKv4VCR HTML code: < ...

  7. java判断是否是数字

    1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < str.length(); i++){ ...

  8. mongo 副本集

    副本集配置文件 dbpath=/hwdata/mongodb/datalogpath=/hwdata/mongodb/logs/master.logpidfilepath=/hwdata/mongod ...

  9. python -反射hasattr、setattr、delattr

    login.py #!/usr/bin/dev python# coding:utf-8 def index(): print u'欢迎访问xx网站首页' def login(): print u'登 ...

  10. django不定义model,直接执行自定义SQL

    如果不想定义model,直接执行自定义SQL,可如下操作: 1. 通过 connections获取db连接,如果是多个数据库,connections['dbName'] 来选择 2. 获取游标 cur ...