zoukankan      html  css  js  c++  java
  • 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;

    }

       

       

  • 相关阅读:
    《将博客搬至CSDN》
    所谓找链表中点
    虚函数
    编辑距离
    数组移位
    DFA
    Single Number III
    XOR异或解惑
    First Bad Version
    while(!in.empty()) 和 while(in.size())
  • 原文地址:https://www.cnblogs.com/keedor/p/4529032.html
Copyright © 2011-2022 走看看