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 ...
随机推荐
- HTML的day1 HTML的标签
a标签和锚点 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- [UE4]Scale Box:缩放容器
一.Scale Box只能有一个子控件,再拖放一控件进去是不行的. 二.Scale Box缩放保持长宽比例 三. Scale Box.Strectching.Strectch:拉伸设置. Scale ...
- Northwind学习笔记
一.单表查询 --1.查询订购日期在1996年7月1日至1996年7月15日之间的订单的订购日期.订单ID.客户ID和雇员ID等字段的值 SELECT OrderID , CustomerID , E ...
- C#获取当前路径的七种方法
//1.获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; // ...
- scala spark-streaming整合kafka (spark 2.3 kafka 0.10)
Maven组件如下: ) { System.err.println() } StreamingExamples.setStreamingLogLevels() )) ) { System.) } )) ...
- 使用fdisk进行分区
fdisk进行分区 1.首先使用fdisk -l 发现待分区磁盘/dev/vdb 大小为1TB 2.fdisk /dev/vdb 对该磁盘进行分区,输入m并回车 3.输入n并回车,n是“new”新建 ...
- 纯Java——简易高并发框架
转自:https://blog.csdn.net/MonkeyDCoding/article/details/81369610 0.源代码github-简易高并发框架 注:本篇博客知识来自于网课. 1 ...
- shell脚本运行java程序jar
在UBuntu上部署项目的时候,我们往往通过一段shell来启动程序,甚至是通过crontab定时任务来定时的调用java程序,但是很奇怪的一个问题就是,比如我写了一个如下的shell脚本: #!/b ...
- web和app的简单测试区别和工具介绍
首先说一下我对Web自动化测试与CS自动化测试的认识.从宏观对比都是通过脚本自动化完成功能的验证,区别不大.Web测试更为显著的浏览器兼容性.安全,以及与Web技术相关的表单测试.链接测试等,其实都是 ...
- 最新WordConut
一.代码地址:https://gitee.com/cainiaoY/WordCount 二.项目分析:代码根据实现的功能不同分为两个模块,一个wcFuctiong类,一个wcTest类,其中wcFuc ...