📌  相关文章
📜  最小化在给定矩阵中所有对均具有按位与的数组的总和(1)

📅  最后修改于: 2023-12-03 15:40:15.775000             🧑  作者: Mango

最小化对均具有按位与的数组的总和

问题描述

给定一个矩阵,其中包含n个长度为m的二进制数组,您的任务是找到一个数组,使得所有其它数组与此数组按位与的结果最小,并返回该结果。例如,在以下示例中,第一行的“0010”与第二行的“0001”进行按位与后得到“0000”,是所有按位与结果中最小的。

Input: [[0,0,1,0], [0,1,0,1], [1,0,1,1]]
Output: 0
Explanation: Every possible AND of any two arrays results in 0, so the answer is 0.
解决方案

这是一个典型的位运算问题。对于任何两个数的按位与结果,都只有在二进制下的每个位置都为1时才为1,否则为0。 因此,一个优化的解决方案是找到最左侧的相同位数,并将其余位置全部置为0,以便在按位与时获得最小值。

我们将遍历从0到30的所有位数,对于当前位数,我们将检查矩阵中的所有数组是否都具有此位。如果是,我们将此位添加到结果数中,并将矩阵中的所有数组的相应位都变为0。重复此过程,直到所有位数都被检查为止。最后返回所得结果。下面是此算法的Python实现代码:

class Solution:
    def matrixBitwiseAnd(self, matrix: List[List[int]]) -> int:
        res = 0
        for i in range(31, -1, -1):
            flag = 1
            for row in matrix:
                if row[-1] & flag != flag:
                    flag = 0
                    break
            res |= flag * (1 << i)
            for j in range(len(matrix)):
                matrix[j][-1] &= ~flag
            if not any(matrix):
                break
        return res
复杂度分析

该算法的时间复杂度为O(nm),其中n是数组的长度,m是数组中的元素位数。这是遍历所有位并检查所有数组的必须工作量。 空间复杂度为O(m),其中m是数组中的元素位数。这是记录结果的必须开销。 对于很长的数组,由于我们只需要比较31个位数,因此该算法是高效的。