Algorithm 在所有1的0-1矩阵中,哪一行的1最多;“在左边?”;?

Algorithm 在所有1的0-1矩阵中,哪一行的1最多;“在左边?”;?,algorithm,math,matrix,Algorithm,Math,Matrix,问题 nxn矩阵的每一行由1和0组成,因此在任何一行中,所有1都位于任何0之前。查找包含O(n)中大多数1的行 示例 1 1 1 1 1 0 <- Contains maximum number of 1s, return index 1 1 1 1 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 0 0 10从1,1开始 如果单元格中包含1,则表示您位于迄今为止最长的行上;写下来,然后向右走。 如果单元格包含0,则向下移动。 如果单

问题

nxn矩阵的每一行由1和0组成,因此在任何一行中,所有1都位于任何0之前。查找包含O(n)中大多数1的行

示例

1 1 1 1 1 0  <- Contains maximum number of 1s, return index 1
1 1 1 0 0 0
1 0 0 0 0 0
1 1 1 1 0 0
1 1 1 1 0 0
1 1 0 0 0 0
10从1,1开始

如果单元格中包含1,则表示您位于迄今为止最长的行上;写下来,然后向右走。 如果单元格包含0,则向下移动。
如果单元格超出边界,则完成操作。

从第一行开始。保留编号为1最多的行
R
,以及
R
中最后1个的索引i。在每次迭代中,将当前行与索引
i
上的行
R
进行比较。如果当前行在位置
i
上有
0
,则行
R
仍然是答案。 否则,返回当前行的索引。现在我们只需要找到当前行的最后一个1。从索引
i
迭代到当前行的最后1,将
R
设置到此行,并将
i
设置到新索引

              i
              |  
              v 
R->   1 1 1 1 1 0  
|
v     1 1 1 0 0 0 (Compare ith index of this row)
      1 0 0 0 0 0         Repeat
      1 1 1 1 0 0           "
      1 1 1 1 0 0           "
      1 1 0 0 0 0           "
您可以在
O(N)
中执行此操作,如下所示:

A[i][j]
开始,使用
i=j=0

          1, keep moving to the right by doing j++
A[i][j] = 
          0, move down to the next row by doing i++
当到达最后一行或最后一列时,
j
的值就是答案

伪代码:

Let R be number of rows
Let C be number of columns

Let i = 0
Let j = 0   
Let max1Row = 0

while ( i<R && j<C )
   if ( matrix[i][j] == 1 )
      j++
      max1Row = i
   else
      i++
end-while


print "Max 1's = j"
print "Row number with max 1's = max1Row"
设R为行数
设C为列数
设i=0
设j=0
设max1Row=0

而(i一些C代码可以做到这一点

int n = 6;
int maxones = 0, maxrow = -1, row = 0, col = 0;
while(row < n) {
    while(col < n && matrix[row][col] == 1) col++;
    if(col == n) return row;
    if(col > maxones){
        maxrow = row;
        maxones = col;
    }
    row++;
}
int n=6;
int maxones=0,maxrow=-1,row=0,col=0;
while(行最大值){
maxrow=行;
maxones=col;
}
行++;
}
int[]getMax1withRow(int[][]矩阵){
int[]结果=新的int[2];
int行=矩阵长度;
int cols=矩阵[0]。长度;
int i=0,j=0;
int max_row=0;//这将显示最大值为1的行。初始化指向第0行。
int max_one=0;//max one
while(i最大值){
最大值=j;
最大行=i;
}
j=0;//再次从第一列开始
i++;//增加行数
}
结果[0]=最大值;
结果[1]=最大行数;
返回结果;
}

时间复杂度=>O(行+列),在更坏的情况下,如果每一行都有n-1个,除了最后一行有n个1,那么我们必须一直走到最后一行。

这里的n是什么?行数?列数?列数?单元格数?问题说明
nxn
,因此n既是列又是行。这是错误的……如果您的第一个单元格[0,0]包含一个0,该行中的其余单元格包含所有1。后续行中的所有其余单元格仅包含0。然后您的答案将是i,其中i是最大行号,j将是0。@Swaranga Sarma:您需要仔细阅读问题,所有1都位于任何0之前。代码似乎不正确,特别是
“if(矩阵[i][j]==1)j++max1Row=i“
部分。您没有跟踪最大行数为1的行数。如果我们从右到左开始,而不是从左到右移动,则会更好,这样,如果以0结束,我们可以跳过大部分行。您的时间复杂度为
O(n^2)
因为
j=0;//再次从第一列开始
。Thom回答的要点是,您不必返回到行的开头,因为您知道如果下一行在当前列中没有
1
,那么它不可能是
1
最多的行。
int [] getMax1withRow(int [][] matrix){
    int [] result=new int[2];
    int rows=matrix.length;
    int cols=matrix[0].length;
    int i=0, j=0;
    int max_row=0;// This will show row with maximum 1. Intialing pointing to 0th row.
    int max_one=0;// max one
    while(i< rows){
        while(matrix[i][j]==1){
            j++;
        }
        if(j==n){
             result[0]=n;
             result[1]=i;
             return result;
        }
        if(j>max_one){
             max_one=j;
             max_row=i;
        }
        j=0;// Again start from the first column
        i++;// increase row number
    }
    result[0]=max_one;
    result[1]=max_row;
    return result;
}