Java:统计二维Boolean数组应用规则后剩余的false数量
解决二维Boolean数组剩余false统计问题
咱们先把规则再明确一遍,避免理解偏差:只要某一行或者某一列中存在至少一个true,那么这整行和整列里的所有false都不算入最终统计;只有那些完全不在任何含true的行/列里的false,才是我们要统计的目标。
核心思路
要高效解决这个问题,不用每次遇到true就反复遍历行和列(那样容易重复操作,效率低),可以分两步走:
- 第一步:先扫一遍数组,用两个集合记录下所有包含true的行号和列号,这样后续查询是否属于“需排除的行/列”时,时间复杂度是O(1)。
- 第二步:要么再次遍历数组统计符合条件的false,要么直接通过计算得到结果(优化版)。
代码示例(Python)
基础遍历版
适合刚接触这类问题的同学,逻辑直观:
def count_remaining_false(array): if not array or not array[0]: return 0 rows_with_true = set() cols_with_true = set() # 第一步:标记所有含true的行和列 for i in range(len(array)): for j in range(len(array[0])): if array[i][j]: rows_with_true.add(i) cols_with_true.add(j) # 第二步:统计符合条件的false count = 0 for i in range(len(array)): if i in rows_with_true: continue # 这行有true,直接跳过整行 for j in range(len(array[0])): if j not in cols_with_true and not array[i][j]: count += 1 return count
优化计算版
如果数组规模较大,这个版本效率更高——因为排除了含true的行/列后,剩余的交叉区域里一定全是false(否则该行/列会被标记为含true),所以直接计算区域大小即可:
def count_remaining_false_optimized(array): if not array or not array[0]: return 0 rows_with_true = set() cols_with_true = set() for i in range(len(array)): for j in range(len(array[0])): if array[i][j]: rows_with_true.add(i) cols_with_true.add(j) valid_rows = len(array) - len(rows_with_true) valid_cols = len(array[0]) - len(cols_with_true) # 有效行和有效列的交叉区域全是false return valid_rows * valid_cols
举个例子验证
就用题目里提到的场景:
matrix = [ [True, False, False], [False, False, False], [False, False, False] ]
- 含true的行是
{0},含true的列是{0} - 有效行数量是
3-1=2,有效列数量是3-1=2 - 最终统计结果是
2*2=4,和预期完全一致。
内容的提问来源于stack exchange,提问作者antimuon
相关产品推荐
相关产品推荐

