研究了一种算法,该算法需要计算矩阵中连续1的最长数。提供的解决方案描述和解决方案如下:
蛮力方法非常简单。我们直接遍历给定矩阵中的每一条有效线:即水平、垂直、中间对角线上下的对角线、中间反对角线上下的反对角线。每次遍历过程中,如果遇到连续的1,我们会不断增加计数。我们会为遇到的任何不连续重置计数。在这样做的同时,我们还跟踪迄今为止发现的最大计数。
public class Solution {
public int longestLine(int[][] M) {
if (M.length == 0)
return 0;
int ones = 0;
//horizontal
for (int i = 0; i < M.length; i++) {
int count = 0;
for (int j = 0; j < M[0].length; j++) {
if (M[i][j] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
//vertical
for (int i = 0; i < M[0].length; i++) {
int count = 0;
for (int j = 0; j < M.length; j++) {
if (M[j][i] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
//upper diagonal
for (int i = 0; i < M[0].length || i < M.length; i++) {
int count = 0;
for (int x = 0, y = i; x < M.length && y < M[0].length; x++, y++) {
if (M[x][y] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
//lower diagonal
for (int i = 0; i < M[0].length || i < M.length; i++) {
int count = 0;
for (int x = i, y = 0; x < M.length && y < M[0].length; x++, y++) {
if (M[x][y] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
//upper anti-diagonal
for (int i = 0; i < M[0].length || i < M.length; i++) {
int count = 0;
for (int x = 0, y = M[0].length - i - 1; x < M.length && y >= 0; x++, y--) {
if (M[x][y] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
//lower anti-diagonal
for (int i = 0; i < M[0].length || i < M.length; i++) {
int count = 0;
for (int x = i, y = M[0].length - 1; x < M.length && y >= 0; x++, y--) {
//System.out.println(x+" "+y);
if (M[x][y] == 1) {
count++;
ones = Math.max(ones, count);
} else
count = 0;
}
}
return ones;
}
}
复杂性分析
时间复杂度:O(n^2)我们沿着整个矩阵遍历4次。空间复杂度:O(1)。使用恒定空间。
如果我们简单地遍历每一行的矩阵
我认为你的困惑来自这样一个事实,即有n²元素,而不是n。
该算法访问每个元素的次数有限。可以说它在元素数量上是线性的,因此在n中是二次的。
什么是?
矩阵是正方形吗?
如果是,则n
是矩阵的宽度/高度。
如果不是,则需要m
和n
,独立表示宽度和高度。
假设它不是正方形的。
如果将宽度翻倍(m
),代码中会发生什么?
迭代总数翻倍,因此性能与m
成线性关系。
如果将高度加倍(n),代码中会发生什么<总迭代次数加倍,因此性能与n成线性关系。
结论:性能为O(mn)
当然,如果n是矩阵中的值数,则性能为O(n)。
我的数据是这样的,X和Y是缺陷的中心。我想在矩阵中指定缺陷。 我创建了一个只有0的矩阵200*200。我想通过以下方式将1放入矩阵中: 每个坐标X Y都是1。例如,我们可以看到ID 1,它将允许1到坐标(2,3)的单元格。ID 2将允许1进入我的手机(7,12)。 我已经用代码完成了这项工作 现在我想做一些棘手的事情。我defect_ID,我想使用我的X_range和Y_range值将值1分配给这
我遇到了这个代码。它只扫描数组元素一次。但我对有两个嵌套的while循环将复杂性增加到O(n^2)感到困惑。代码如下: 我正在学习算法,所以如果我哪里出了问题,请纠正我。非常感谢。
我只是想知道2D中Dijkstra的时间复杂性 我知道Dijkstra与二进制堆是O(ElogV) 但是如果我们有一个n乘n的2D数组,数组中的每个节点都有顶点(x,y,权重) 它可以向四个方向移动上,下,左,右 因此,总顶点是n^2,边缘大约是4(n^2)。例如,如果顶点在 因此,如果我们在2D中运行该算法,那么时间复杂度将降低 - 是这样吗? 我渴望得到答案。。谢谢你阅读这篇文章。
每个顶点可以连接到(V-1)个顶点,因此每个顶点的相邻边数是V-1。假设E代表连接到每个顶点的V-1条边。 查找和更新最小堆中每个相邻顶点的权重为O(log(V))+O(1)或 因此,从上面的步骤1和步骤2,更新顶点的所有相邻顶点的时间复杂度是e*(logV)。或. 因此所有V顶点的时间复杂度为V*(E*logv),即。 但Dijkstra算法的时间复杂度为O(ElogV)。为什么?
问题陈述:给定一个非空字符串s和一个包含非空单词列表的字典字词,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。 我的解决方案: 我不确定时间和空间的复杂性。我认为它应该是2^n,其中n是给定字符串s的长度。谁能帮我证明时间和空间的复杂性? 我还有以下几个问题: 如果我不在GetAllSences函数中使用memo,那么在本例中时间复杂度是多少? 还有比这更好
我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。