程序计算最小操作数以翻转列以在Python中成为目标

假设我们有一个矩阵M和一个目标矩阵T,它们的行和列数相同。现在假设有一个操作,其中我们翻转矩阵中的特定列,以便将所有1都转换为0,并将所有0都转换为1。因此,如果我们可以免费对矩阵行进行重新排序,请找到将M转换为T所需的最小操作数。如果没有解,则返回-1。

因此,如果输入像M =

0
0
1
0
1
1

T =

0
1
1
0
1
1

那么输出将为1,因为首先将行重新排序为-

0
0
1
1
1
0

然后将列1翻转到-

0
1
1
0
1
1

为了解决这个问题,我们将按照以下步骤操作:

  • nums1:=一个新列表,nums2:=一个新列表

  • 对于矩阵中的每一行,执行

    • ths:=(ths * 2)+行中的最后一个元素,并删除行中的最后一个元素

    • := 0

    • 当行不为空时,执行

    • 在nums1的末尾插入

    • 对于目标中的每一行,执行

      • := 0

      • 当row非零时,执行

      • ths:=(ths * 2)+行中的最后一个元素,并删除行中的最后一个元素

      • 在nums2的末尾插入

    • ret:=无穷大

    • 对于nums1中的每个num,执行

      • 需要:= my_xor XOR nums2 [i]

      • 如果cts [needed]为零,则

      • 除此以外,

      • ret:=最小最小值,以及my_xor的置位位数

      • 如果ret与无穷大不同,则返回ret,否则返回-1

      • 从循环中出来

      • cts [需要]:= cts [需要]-1

      • cts:=包含nums1中不同元素及其频率的映射

      • cts [num]:= cts [num]-1

      • my_xor:= num XOR nums2 [0]

      • 对于范围1到nums2的i

      让我们看下面的实现以更好地理解-

      示例

      class Solution:
         def solve(self, matrix, target):
            nums1 = []
            nums2 = []
            for row in matrix:
               ths = 0
               while row:
                  ths = (ths<<1) + row.pop()
               nums1.append(ths)
            for row in target:
               ths = 0
               while row:
                  ths = (ths<<1) + row.pop()
               nums2.append(ths)
            ret=float('inf')
            from collections import Counter
            for num in nums1:
               cts = Counter(nums1)
               cts[num] -= 1
               my_xor = num^nums2[0]
               for i in range(1,len(nums2)):
                  needed = my_xor^nums2[i]
                  if not cts[needed]:
                     break
                  cts[needed]-=1
               else:
                  ret=min(ret,bin(my_xor).count('1'))
            return ret if ret!=float('inf') else -1
      ob = Solution()M = [
         [0, 0],
         [1, 0],
         [1, 1]
      ]
      T = [
         [0, 1],
         [1, 0],
         [1, 1]
      ]
      print(ob.solve(M,T))

      输入项

      M = [[0, 0],[1, 0],[1, 1]] T = [[0, 1],[1, 0],[1, 1]]

      输出结果

      1
      猜你喜欢