一个矩阵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;
}