我在接受采访时遇到了这个问题。 你有一个包含1和0的nxn矩阵。您必须以最有效的方式找到包含最大数量1的行。我知道它可以在n ^ 2中完成,但是有没有最佳解决方案?
答案 0 :(得分:7)
最优解是O(n ^ 2)。假设矩阵仅包含零。你必须检查每个细胞以确定这一点。这是O(n ^ 2)。
你可以优化算法,使它停止搜索,如果它找到一个只包含1s的行(这必须是最优的),或者如果它已连续看到那么多的零,那么它不可能超过目前为止看到的最大值。在某些情况下,这可能会显着提高速度,但在一般情况下仍然是O(n ^ 2)。
答案 1 :(得分:0)
作为优化:您解析列,从现在起计算每行1的MAX。在n / 2步之后,你开始消除那些不合适的行。 (The rows with MAX number of 1s - rowSum(number of ones in that row) > (the number of columns unchecked)
- 复杂度O(n^2)
答案 2 :(得分:0)
最坏的情况复杂性无论如何都是O(n 2 )。
但我们可以减少常数和一般的复杂性。
以x (x < n)
行数计算#1。
对于剩余的n-x行,当我们发现我们无法从该行找到bext答案时停止。
现在要点是获得x的最佳值。
PS:类似于 - 选择100中最好的男人,条件是你只能选择三次。
答案 3 :(得分:0)
这是JavaScript中“最”有效的实现。
像上面的答案一样;如果你用N 1打一行就会短路,如果当前行不可能有更大的1,则继续外(行)循环。
但是这个答案也证明了有效地使用(读取:放置)所涉及的条件逻辑。
// return the smallest row index 0 - (N-1) containing the greatest number of 1's
function MaxRow(M, N) {
// initialize max to 0 if you want to return null for an all zero matrix
// initialize max to -1 if you want to return 0 (row 0) for an all zero matrix
var max = 0;
var result = null;
var row1s;
rowLoop:
for(var row = 0; row < N; row++) {
row1s = 0;
for(var col = 0; col < N; col++) {
if((N - col) + row1s < max) { // row's current potential 1's
continue rowLoop; // next row
}
row1s += M[row * N + col]; // + 0 or + 1
}
if(row1s > max) { // new max
max = row1s; // save new max value
if(max == N) { // largest possible
return row;
}
result = row;
}
}
return result;
}