对于仅具有 0 或 1 的给定矩阵 NxN。找出至少出现一个 1 的行数和列数。
例如
0 0 0 0
1 0 0 1
1 0 0 1
1 1 0 1
至少有一次为 1 的行数:3
Col 计数有 1 至少一次:3
头脑被冻结想不出比正常双循环更好的方法给我 O(n^2) 期待一些帮助
对于仅具有 0 或 1 的给定矩阵 NxN。找出至少出现一个 1 的行数和列数。
例如
0 0 0 0
1 0 0 1
1 0 0 1
1 1 0 1
至少有一次为 1 的行数:3
Col 计数有 1 至少一次:3
头脑被冻结想不出比正常双循环更好的方法给我 O(n^2) 期待一些帮助
该解决方案证明您不能读取小于 O(N^2) 的矩阵,但如果您对这个问题的意思是您想在搜索中计算您的结果:我认为这不是做它或说我需要比 O(2*(n^2)) 更好地解决这个问题。
您需要了解数组中的每个单元格。假设您有一个图表,每个顶点都指向矩阵中的一个单元格。要查找您应该在图表中搜索的单元格的值。您可以使用 DFS 来做到这一点。命令。
DFS的时间和空间分析根据其应用领域的不同而不同。在理论计算机科学中,DFS 通常用于遍历整个图,并且需要时间 O(|E|),与图的大小成线性关系。在这些应用程序中,它还在最坏的情况下使用空间 O(|V|) 来存储当前搜索路径上的顶点堆栈以及已经访问过的顶点集。因此,在这种情况下,时间和空间界限与广度优先搜索相同,选择使用这两种算法中的哪一种较少取决于它们的复杂性,而更多地取决于两种算法产生的顶点排序的不同属性.
并且您的图形中有 N^2 个顶点 - 数组至少 (O(V+E) >= O(V))。所以你不能比使用每个数据结构的 O(n^2) 做得更好。(因为计算这个顺序与边缘结构无关)。
maxcol=0;
for(int i=0;i<n;i++)
{
sumcol=0;
for(int j=0;j<n;j++)
{
if (a[i][j]==1)
{
sumcol=sumcal+1;
}
}
if (sumcol>maxcol)
{
maxcol=sumcol;
}
}
对行重复此操作。这是非常简单的解决方案,但此代码具有最小空间。您无法通过算法思想对其进行改进。您应该注意算法复杂性的方法。您可以通过一次搜索来解决它,但只会增加复杂性你的代码。
思路:将每行每列的数字总和存储在矩阵中。
附加存储:O(n * log(n)) - 假设 O(log(n)) 位存储一个数字。
计算非零行和列所需的时间:O(n)。
这是一种时间优化算法,而不是“空间和时间优化算法”——它需要更多空间但更少时间。