O(n)时间解决的面试题:二进制矩阵中1的个数

问题描述

   

给定n*n01方阵,每一行都是降序排列,即先前的一段一定是1,到10分界处之后才是全0,求1最多的那行中1的个数

   

分析问题

   

如果数出每一行1的个数,然后再看哪一行1的个数最多,这样时间复杂度是O(n^2)

   

如果用二分法优化,可以找出每一行01的分界处,然后就知道了每一行的1的个数,时间复杂度为nlogn

   

还有一种时间复杂度为n的方法,算法的策略师如果某个位置是1,那么向右走,如果是0,则向下走,这样的策略使得我们能够遍历到最优解,这个思想也是我们不需要遍历所有的可行域,只需要我们遍历的过程一定能够扫过最优解即可

   

算法实现

   

int sol(vector<vector<char>> &a){

int n= a.size();

int best=0;

for(int i=0;(best<n)&&(i<n);++i){

//当当前元素也即a[i][best]等于1时,让best++,如果不是,则让i++

while((best<n)a[i][best]==1) ++best;

}

return best;

}

   

   

posted @ 2015-05-25 22:01  keedor  阅读(572)  评论(0编辑  收藏  举报