1007.行相等的最少多米诺旋转

88 阅读1分钟

题目:
在一排多米诺骨牌中,A[i] 和 B[i] 分别代表第 i 个多米诺骨牌的上半部分和下半部分。(一个多米诺是两个从 1 到 6 的数字同列平铺形成的 —— 该平铺的每一半上都有一个数字。)

我们可以旋转第 i 张多米诺,使得 A[i] 和 B[i] 的值交换。

返回能使 A 中所有值或者 B 中所有值都相同的最小旋转次数。

如果无法做到,返回 -1.
算法:
方法一:不知道叫啥

func minDominoRotations(A []int, B []int) int {
	// 因为数字取值范围[1,6],用nums保存A,B中每个数字出现的次数
	nums := [7]int{}
	// 保存A中每个数字出现的次数
	as := [7]int{}
	// 保存B中每个数字出现的次数
	bs := [7]int{}
	for i := 0; i < len(A); i ++ {
		if A[i] == B[i] {
			nums[A[i]] ++
		} else {
			nums[A[i]] ++
			nums[B[i]] ++
			as[A[i]] ++
			bs[B[i]] ++
		}
	}
	for i, v := range nums {
		// 有一个数i在每一个位置都出现了,不可能再有第二个
		// 假设在A出现了2次,在B出现了4次,则翻转2次即可
		if v == len(A) {	
			return min(as[i], bs[i])
		}
	}
	return -1
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}