如何确定n×n 0-1矩阵元素取值及构造满足行列和约束的矩阵?
构造满足行和与列和要求的0-1矩阵
针对你提出的构造n×n(n≤900)0-1矩阵的问题——已知每行的行和、每列的列和且保证解存在,这里分享一种简单高效的贪心实现方案,同时解释元素取值的逻辑:
核心思路:贪心匹配剩余配额
矩阵中每个元素a(i,j)的取值逻辑很直接:当第i行还需要放置1,且第j列也还需要接收1时,就将a(i,j)设为1;否则设为0。我们通过维护每行、每列剩余的1的配额,逐行逐列填充即可。
具体步骤
初始化准备
- 创建一个全0的n×n矩阵
matrix - 复制行和数组到
row_left(记录每行还需放置的1的数量) - 复制列和数组到
col_left(记录每列还需接收的1的数量)
- 创建一个全0的n×n矩阵
逐行填充矩阵
对每一行i(从0到n-1):- 遍历每一列j(从0到n-1):
- 如果
row_left[i] > 0且col_left[j] > 0:- 把
matrix[i][j]设为1 row_left[i] -= 1,col_left[j] -= 1
- 把
- 当
row_left[i]变为0时,直接跳出当前行的循环,处理下一行
- 如果
- 遍历每一列j(从0到n-1):
验证与输出
填充完成后,矩阵自然满足所有行和与列和的要求(题目已保证解存在,无需额外判断),直接输出即可。
示例演示
以你给出的n=4为例:
- 初始行和:
[2,2,1,1]→row_left = [2,2,1,1] - 初始列和:
[2,0,2,2]→col_left = [2,0,2,2]
填充过程:
- 第0行:需要2个1。遍历列时,j=1的
col_left为0跳过,最终在j=2、j=3处设1,row_left[0]变为0,col_left变为[2,0,1,1] - 第1行:需要2个1。在j=0、j=3处设1,
row_left[1]变为0,col_left变为[1,0,1,0] - 第2行:需要1个1。在j=2处设1,
row_left[2]变为0,col_left变为[1,0,0,0] - 第3行:需要1个1。在j=0处设1,
row_left[3]变为0,col_left变为[0,0,0,0]
最终得到的矩阵和你给出的示例一致:
0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0
复杂度说明
这种方法的时间复杂度是O(n²),对于n=900来说,计算量是810,000次操作,完全在常规计算资源的处理能力范围内,效率很高。
内容的提问来源于stack exchange,提问作者Nitin Singhal
相关产品推荐
相关产品推荐

