2024-1-4
文章目录
- [2397. 被列覆盖的最多行数](https://leetcode.cn/problems/maximum-rows-covered-by-columns/)
- 方法:二进制枚举
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; // 返回结果
}
点击移步博客主页,欢迎光临~