Algorithm 1'的线性时间数计算;s

Algorithm 1'的线性时间数计算;s,algorithm,Algorithm,nxn数组A的每一行都由1和0组成,因此,在A的任何一行i中,所有1都位于该行的任何0之前。当i=0,1,·,n时,第i行中的1数>=第i行中的1数+1−2.A已在内存中,请描述一种在O(n)时间内运行的方法,用于计算数组A中的1数 我被时间的复杂性所困扰。知道我该怎么做吗?我们知道的:(1)每行1s的数量没有增加,(2)每行中所有1s都在零之前(比如说在零的左边) 现在,假设您从第一行开始,一直计数1s,直到到达第一个零(在第一行)。调用该索引,1s与零相交,i 当您向下移动到每个连续的行时,

nxn数组A的每一行都由1和0组成,因此,在A的任何一行i中,所有1都位于该行的任何0之前。当i=0,1,·,n时,第i行中的1数>=第i行中的1数+1−2.A已在内存中,请描述一种在O(n)时间内运行的方法,用于计算数组A中的1数

我被时间的复杂性所困扰。知道我该怎么做吗?

我们知道的:(1)每行
1
s的数量没有增加,(2)每行中所有
1
s都在零之前(比如说在零的左边)

现在,假设您从第一行开始,一直计数
1
s,直到到达第一个零(在第一行)。调用该索引,
1
s与零相交,
i

当您向下移动到每个连续的行时,您永远不会通过哪种方式找到该行的
i
?(提示:你永远不会走右边。)


现在想一想,如果在每一行中从同一索引开始,然后向左移动以找到该行的
i
(零和
1
s相交处),那么最多可以移动多少个单元格。你一共参观了多少行?把这两个加起来,你就有了复杂性。

这个问题可以在
O(R+C)
中解决,其中
R
表示行数,
C
表示列数

这个想法很简单,因为

i
行中的1个数是>=第
i+1行中的1个数

也就是说,


i
行中0的数量是,我建议从画一些例子开始,用手解决它们,使用脑海中浮现的任何快捷方式。
Example:

 1  1  1  0
 1  0  0  0
 0  0  0  0

First Row:  // Count number of 0's from backwards, only 1 zero in this case, so number of 1's = Column count(C) - number of 0's i.e. 3
 1  1  1  0

Second Row: // Iterate from current index towards left until 1st 1, so now no. of 0's is 3 so no. if 1's = C - no. of 0's = 1
 1  1  1  0
          |
 1  0  0  0
   <- <- <-

Third Row:
 1  1  1  0
          |
 1  0  0  0
   <- <- <-
    |
 0  0  0  0
<- <-
no. of 1's = C - no. of 0's = 0
#include <iostream>
using namespace std;

int arr[6][4] = {
    1,1,1,1,1,0,
    1,1,1,1,0,0,
    1,1,0,0,0,0,
    1,0,0,0,0,0
};

int countOnes(){
    int ans = 0, r = 6, c = 4, i = 0, j = c - 1;
    for(i = 0; i < r; i++){
        while(j>=0 && arr[i][j]==0)
            j--;
        ans+=(j+1);
    }
    return ans;
}

int main() {
    int onesCount = countOnes();
    cout<<onesCount;
    return 0;
}