算法:银行中的激光束数量

问题:

银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 '0' 和若干 '1' 组成。'0' 表示单元格是空的,而 '1' 表示单元格有一个安全设备。

对任意两个安全设备而言,如果同时 满足下面两个条件,则二者之间存在 一个 激光束:

两个设备位于两个 不同行 :r1 和 r2 ,其中 r1 < r2 。
满足 r1 < i < r2 的 所有 行 i ,都 没有安全设备 。
激光束是独立的,也就是说,一个激光束既不会干扰另一个激光束,也不会与另一个激光束合并成一束。

返回银行中激光束的总数量。

解决

/有激光束的条件:能够连接的两个位置不在同一行,并且两个位置之间的行都没有安全装置
//1、初次尝试O(MN)
class Solution {
    public int numberOfBeams(String[] bank) {
        int len1=bank.length;        //获取‘二维’区域高度
        //本行的每个位置对应“目的行”有多少个装置就有多少条激光
        int[] targer=new int[len1];
        for(int i=0;i<len1;i++){
            String cur=bank[i];
            int k=0;
            for(int j=0;j<cur.length();j++){
                if(cur.charAt(j)=='1'){
                    k++;
                }
            }
            targer[i]=k;             //获取每一行1(装置)的个数
        }
            int anx=0;                               //激光数
            int pro=0;
            for (int r = 0; r < len1; r++) {
                if (targer[r] != 0) {
                    anx+=pro*targer[r];
                    pro=targer[r];                      //将当前值给pro,方便下一次遇见不为0的行
                }

            }
        return anx;
    }
}

//2、优化(常数时间上)
class Solution{
    public static int numberOfBeams(String[] bank) {
            int len1=bank.length;                           //获取‘二维’区域高度
            int anx=0;                                      //激光数
            int pro=0;

            for (String cur : bank) {
                int k = 0;
                for (int j = 0; j < cur.length(); j++) {
                    if (cur.charAt(j) == '1') {
                        k++;
                    }
                }
                if (k != 0) {
                    anx += pro * k;
                    pro = k;                          //将当前值给pro,方便下一次遇见不为0的行
                }
            }
            return anx;
        }
}

遇到问题

  • 优化后空间复杂度确实比之前小了,但是时间复杂度为什么还更大呢?
  • 明明减少了一次遍历target遍历
posted @   new_monkey  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示