找出具有最大1数的行,写下伪代码及其复杂度分析。

一个矩阵A{1...n,1..n]只包含0和1的值,此外,在A的每一行中,所有的1都在所有的0之前。请设计一个复杂度为O(n)的算法,找出具有最大1数的行,写下伪代码及其复杂度分析。

思路:
1、从第一行开始,找到最后一个1的位置,记作c
2、然后从下一行的c开始,如果右边还有1的话,继续往右查找到最后一个1,重新记作c;否则跳过这一行直接到下一行;
3、接着从c开始,重复第2步这个过程,直到最后一行;最后返回最大c所在行即可
时间复杂度分析,共n行n列,所以向右、向下共查找了n+n次,时间复杂度为O(n+n)=O(n)

int findMax1(int A[][4], int n){
    int ans = 0;
    int i=0, j=0;
    for(; i<n; i++){
        for(; j<n;){   //注意:虽然看起来是两个for循环,觉得复杂度是O(n^2),但实际上j只会一直增加,i也一直增加,所以复杂度是O(n+n)=O(n)
            if(A[i][j]==1) {
                j++;
                ans = i;
            }
            else {
                break;
            }
        }
    }
    return ans;
}