程序计算最小操作数以翻转列以在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

      以上是 程序计算最小操作数以翻转列以在Python中成为目标 的全部内容, 来源链接: utcz.com/z/316700.html

      回到顶部