【LeetCode每日一题】2397. 被列覆盖的最多行数

2024-1-4

2397. 被列覆盖的最多行数

在这里插入图片描述

在这里插入图片描述

方法:二进制枚举

1.获取矩阵的行数和列数,并创建一个大小为m的一维数组rows来保存每行的状态

2.通过遍历矩阵的每个元素,将每行的状态用位运算保存到rows数组中。

3.通过使用位掩码mask来遍历所有可能的行选择情况

4.如果mask二进制表示中1的个数不等于numSelect,则跳过当前循环。

5.计算在当前行选择情况下,有多少行满足被选择行的状态,即与mask进行位与运算后等于自身的行数

6.代码更新保存结果的变量ans,取当前结果与新计算的行数满足条件的行数之间的较大值。

public int maximumRows(int[][] matrix, int numSelect) {
    int m = matrix.length; // 获取矩阵的行数
    int n = matrix[0].length; // 获取矩阵的列数
    int[] rows = new int[m]; // 创建一个长度为m的一维数组来保存每行的状态
    
    for (int i = 0; i < m; ++i) { // 遍历矩阵的行
        for (int j = 0; j < n; ++j) { // 遍历矩阵的列
            if (matrix[i][j] == 1) { // 如果当前元素为1
                rows[i] |= 1 << j; // 利用位运算将当前行的状态保存到rows数组中
            }
        }
    }
    
    int ans = 0; // 初始化结果变量为0
    
    for (int mask = 1; mask < 1 << n; ++mask) { // 通过位掩码mask遍历所有可能的行选择情况
        if (Integer.bitCount(mask) != numSelect) { // 如果mask的二进制表示中1的个数不等于numSelect
            continue; // 跳过当前循环,继续下一次循环
        }
        
        int t = 0; // 用于计数满足条件的行数
        
        for (int x : rows) { // 遍历rows数组中的每个元素
            if ((x & mask) == x) { // 如果当前行的状态与mask进行位与运算后等于自身
                ++t; // 将计数器t加1
            }
        }
        
        ans = Math.max(ans, t); // 更新保存结果的变量ans,取当前结果与新计算的行数满足条件的行数之间的较大值
    }
    
    return ans; // 返回结果
}

点击移步博客主页,欢迎光临~

偷cyk的图