偷个懒水一道,题目即解题方法。时间复杂度 O(n^2),空间复杂度 O(1)。
class Solution:
def flipAndInvertImage(self, A: List[List[int]]) -> List[List[int]]:
row, col = len(A), len(A[0])
for i in range(row): # 翻转每行数字
for j in range(col//2):
A[i][j], A[i][col-1-j] = A[i][col-1-j], A[i][j]
for i in range(row): # 翻转01
for j in range(col):
A[i][j] = 1 if A[i][j] == 0 else 0
return A
因为多米诺骨牌中只有 1~6 这六种数字,因此对每个数字 i,把数组 A(或数组 B) 全部变为 i 即可,每次更新最小翻转次数。
这样总共做两次,取两次中的最小翻转次数。时间复杂度为 O(n)。
class Solution:
def minDominoRotations(self, A: List[int], B: List[int]) -> int:
def compare(A, B):
min_ = float("inf")
for i in range(1, 7):
cnt = 0
flag = True
for j in range(len(B)):
if A[j] != i and B[j] == i: # 将B中的数与A翻转
cnt += 1
elif A[j] == i: # A不用翻转
continue
else: # A无法变成全等的数字
flag = False
break
if flag:
min_ = min(min_, cnt) # 更新最小值
return min_
minA = compare(A, B) # 利用B翻转使A全等
minB = compare(B, A) # 利用A翻转使B全等
min_ = min(minA, minB)
return min_ if min_ != float("inf") else -1 # 如果都无法翻转返回-1