You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定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的配额,逐行逐列填充即可。

具体步骤

  1. 初始化准备

    • 创建一个全0的n×n矩阵matrix
    • 复制行和数组到row_left(记录每行还需放置的1的数量)
    • 复制列和数组到col_left(记录每列还需接收的1的数量)
  2. 逐行填充矩阵
    对每一行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时,直接跳出当前行的循环,处理下一行
  3. 验证与输出
    填充完成后,矩阵自然满足所有行和与列和的要求(题目已保证解存在,无需额外判断),直接输出即可。

示例演示

以你给出的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:57:51