Algorithm 在所有1的0-1矩阵中,哪一行的1最多;“在左边?”;?
问题 nxn矩阵的每一行由1和0组成,因此在任何一行中,所有1都位于任何0之前。查找包含O(n)中大多数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,则向下移动。 如果单
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;
}