我有一个看起来像这样的二维数组:
1 1 0 0 1
1 0 1 1 0
0 0 1 1 0
1 1 0 1 1
0 0 1 1 1
我正在试图找出一种方法来确定最长的连续1的链是向上还是向下。在这种情况下,它从第4列第2行开始,其长度为4,向下。
我在考虑使用递归,但是我遇到了一些跟踪位置的问题,特别是在遇到0时。
到目前为止,我有一些与此相关的内容(仅用于检查):
main() {
...
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if (G[i][j] == 1) {
CheckAcross(i, j, n);
}
...
}
void CheckAcross (int i, int j, int n) {
if (i < 0 || i >= n || j < 0 || j >= n) return; // outside of grid
if (G[i][j] == 0 ) return; //0 encountered
G[i][j] = WordCount + 1;
CheckAcross(i, j + 1, n);
}
其中G[][]
是包含1和0的二维数组,n
是行/列数,i
是行号,j
是列号。
感谢您提前获得任何帮助!
答案 0 :(得分:0)
您当前的答案将花费O(n 3 )时间;要评估单行,检查每个可能的开始和结束位置(每个可能的O(n)),并且有n行。
您的算法是正确的,但让我们看看我们是否可以改善运行时间。
如果我们将问题分解为更简单的问题,即“这个1维数组中1s中最长的连续链是什么?”,问题可能会变得更简单。如果我们解决它2n
次,那么我们得到了答案,所以我们只需要将这个值降低到小于O(n 2 )以进行改进。
好吧,我们可以简单地完成这一行,记住最长序列1s的位置(开始和结束)和长度。这需要O(n)时间,并且是最佳的(如果序列全是1或0,我们必须读取每个元素以知道最长序列的开始/结束的位置)。
然后我们可以在O(n 2 )时间内为每一行和每一列简单地解决这个问题。
答案 1 :(得分:0)
创建一个名为V的新n-by-n矩阵。这将为每个单元格存储该单元格中1的数量以及上方的。这将是O(n ^ 2)。
checkAllVertical(int n) {
V = malloc(....) // create V, an n-by-n matrix initialized to zero
for(int r=0; r<n; r++) {
for(int c=0; c<n; c++) {
if(G[r][c]=1) {
if(r==0)
V[r][c] = 1;
else
V[r][c] = 1 + V[r][c];
}
}
}
}
你真的不需要分配所有的V.一次一行就足够了。