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;

    }

       

       

  • 相关阅读:
    基础编程练习题第一波
    TYVJ 1541 八数码
    NOIP 2014 寻找道路
    NOIP2014 解方程
    POJ 3213 矩阵乘法(优化)
    POJ 1523 Tarjan求割点
    POJ 3237 树链剖分+线段树
    SPOJ 375 树链剖分
    NOIP 2012 T2 国王游戏 (贪心+高精)
    POJ 1364 差分约束
  • 原文地址:https://www.cnblogs.com/keedor/p/4529032.html
Copyright © 2011-2022 走看看