Algorithm 在行和列中查找编号相同的位置

Algorithm 在行和列中查找编号相同的位置,algorithm,Algorithm,给定一个仅包含0和1的等维(即nxn)二维数组,我如何找到(忽略矩阵[i][i])包含所有0的第i行和包含所有1的第i列。如果不存在这样的i,则返回-1 矩阵[i][i]可以拥有任何东西。 预期的时间复杂度为O(n) 比如说 对于给定的4x4矩阵 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 0 答案是1(i是从零开始的),因为第二行有所有0,第二列有所有1(忽略[1,1]处的值)。首先,这样的矩阵只有1或0个答案 从第一排开始行走,直到找不到1(对角线值 应该忽略) 开始按列遍

给定一个仅包含0和1的等维(即nxn)二维数组,我如何找到(忽略矩阵[i][i])包含所有0的第i行和包含所有1的第i列。如果不存在这样的i,则返回-1

矩阵[i][i]可以拥有任何东西。

预期的时间复杂度为O(n)

比如说

对于给定的4x4矩阵

1 1 0 0
0 1 0 0
1 1 0 1
0 1 0 0

答案是1(i是从零开始的),因为第二行有所有0,第二列有所有1(忽略[1,1]处的值)。

首先,这样的矩阵只有1或0个答案

  • 从第一排开始行走,直到找不到1(对角线值 应该忽略)
  • 开始按列遍历,直到找不到0为止。如果到达对角线,则转至步骤1
  • 重复1次,直到没有超出矩阵
  • 例如,如果您在带有索引i的行或列中外出,您应该验证i是否为答案。答案将是i或-1

    由于每个操作处理1行或1列操作总数将为n+n,为了验证所需答案,按1行和1列遍历将消耗n+n个操作,我们总共有4*n个操作,这是一个O(n)复杂性

    步行示例:

    0 0 0 1 S S S S S S
    S S S 1 S S S S S S
    S S S 0 0 0 1 S S S
    S S S S S S 1 S S S
    S S S S S S 1 S S S
    S S S S S S 1 S S S
    S S S S S S 1 0 0 0 X
    S S S S S S S S S S
    S S S S S S S S S S
    S S S S S S S S S S
    
    您应该验证7的答案。

    解决方案是:

    return -1
    

    因为如果某一行有全零,而某一列有全一,那么它们相交的单元格中会是什么?

    让我们来了解一些理论:

    如果存在一个全1列(忽略对角线),则最多可以有一行全为零

    相反,如果所有零行都存在,则最多可以有一个all ones列


    这使得问题基本上是线性的。

    请阅读问题陈述和给出的示例carefully@suyash问题陈述清楚地表示“第i列全部为1”和“第i行全部为0”,这意味着一个值必须同时为1和0。然后问题就变成了“实际上,m[i][i]是不相关的”。哈,好吧,你没有添加“忽略对角线”,它以前不存在!步骤3创建了一个循环,并且证明了内部代码是
    O(n)
    。因此,整个复杂性并不是
    O(n)
    ,除非您能够证明您将执行步骤3中的常量times@fjardon:无需遍历列,因为您已经知道这些候选人已被淘汰。从左向右扫描,如果看到1,则跳到对角线。当到达右侧边缘时,验证该行/列。由于每列中只检查了一个元素,所以扫描结果明显为O(n)。@rici请将此作为答案填写,您的算法不同且不清晰。很好的贪婪算法!对于那些不能理解这是O(n)的人,可以这样想:你从左上角开始,在每一步上向右或向下移动。很明显,最大步数将是N+N。@SergeyS:的确如此。正如我所说,它可以减少到N,因为你不需要做下一步。您只需直接跳到对角线(不要费心看它,因为对角线是不相关的)。