【算法】2125. 银行中的激光束数量(多语言实现)

简介: 银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 '0' 和若干 '1' 组成。'0' 表示单元格是空的,而 '1' 表示单元格有一个安全设备。对任意两个安全设备而言,如果同时 满足下面两个条件,则二者之间存在 一个 激光束: 两个设备位于两个 不同行 :r1 和 r2 ,其中 r1 < r2 。 满足 r1 < i < r2 的 所有 行 i ,都 没有安全设备 。激光束是独立的,也就是说,一个激光束既不会干扰另一个激光

2125. 银行中的激光束数量:

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

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

  • 两个设备位于两个 不同行 :r1 和 r2 ,其中 r1 < r2
  • 满足 r1 < i < r2 的 所有 行 i ,都 没有安全设备 。

激光束是独立的,也就是说,一个激光束既不会干扰另一个激光束,也不会与另一个激光束合并成一束。

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

样例 1:

在这里插入图片描述

输入:
    
    bank = ["011001","000000","010100","001000"]
    
输出:
    
    8
    
解释:

    在下面每组设备对之间,存在一条激光束。总共是 8 条激光束:
     * bank[0][1] -- bank[2][1]
     * bank[0][1] -- bank[2][3]
     * bank[0][2] -- bank[2][1]
     * bank[0][2] -- bank[2][3]
     * bank[0][5] -- bank[2][1]
     * bank[0][5] -- bank[2][3]
     * bank[2][1] -- bank[3][2]
     * bank[2][3] -- bank[3][2]
    注意,第 0 行和第 3 行上的设备之间不存在激光束。
    这是因为第 2 行存在安全设备,这不满足第 2 个条件。

样例 2:

在这里插入图片描述

输入:
    
    bank = ["000","111","000"]
    
输出:

    0
    
解释:
    
    不存在两个位于不同行的设备

提示:

  • m == bank.length
  • n == bank[i].length
  • 1 <= m, n <= 500
  • bank[i][j]'0''1'

分析

  • 面对这道算法题目,二当家的陷入了沉思。
  • 关键是理解激光产生的条件,一言以蔽之,每个安全设备会找到最近的有安全设备的行,然后和行上的所有安全设备产生激光。
  • 所以我们可以把没有安全设备的行直接拿掉,之后相邻的行上的安全设备互相之间都会产生激光。

题解

java

class Solution {
    public int numberOfBeams(String[] bank) {
        int ans = 0;

        int lastCount = 0;
        for (String row : bank) {
            int count = 0;
            for (char c : row.toCharArray()) {
                if (c == '1') {
                    ++count;
                }
            }
            if (count > 0) {
                ans += lastCount * count;
                lastCount = count;
            }
        }

        return ans;
    }
}

c

int numberOfBeams(char ** bank, int bankSize){
    int ans = 0;

    int lastCount = 0;
    for (int i = 0; i < bankSize; ++i) {
        char *row = bank[i];
        int count = 0;
        while (*row) {
            if (*row == '1') {
                ++count;
            }
            ++row;
        }
        if (count > 0) {
            ans += lastCount * count;
            lastCount = count;
        }
    }

    return ans;
}

c++

class Solution {
public:
    int numberOfBeams(vector<string>& bank) {
        int ans = 0;

        int lastCount = 0;
        for (const string &row: bank) {
            int count = count_if(row.begin(), row.end(), [](char c) { return c == '1'; });
            if (count > 0) {
                ans += lastCount * count;
                lastCount = count;
            }
        }

        return ans;
    }
};

python

class Solution:
    def numberOfBeams(self, bank: List[str]) -> int:
        ans = 0
        last = 0
        for row in bank:
            cnt = row.count('1')
            if cnt > 0:
                ans += last * cnt
                last = cnt
        return ans
        

go

func numberOfBeams(bank []string) (ans int) {
    lastCount := 0
    for _, row := range bank {
        count := strings.Count(row, "1")
        if count > 0 {
            ans += lastCount * count
            lastCount = count
        }
    }
    return
}

rust

impl Solution {
    pub fn number_of_beams(bank: Vec<String>) -> i32 {
        bank.iter().map(|row| {
            row.as_bytes().iter().filter(|&&c| { c as char == '1' }).count() as i32
        }).filter(|&c| { c > 0 }).scan(0, |l, c| {
            let count = *l * c;
            *l = c;
            Some(count)
        }).sum()
    }
}

原题传送门:https://leetcode-cn.com/problems/number-of-laser-beams-in-a-bank/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
6月前
|
自然语言处理 Rust 算法
【算法】13. 罗马数字转整数(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 | 字符 | 数值 | |--|--| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 | 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1
【算法】13. 罗马数字转整数(多语言实现)
|
自然语言处理 Rust 算法
【算法】9. 回文数(多语言实现)
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
|
4月前
|
自然语言处理 Rust 算法
【算法】17. 电话号码的字母组合(多语言实现)
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
【算法】17. 电话号码的字母组合(多语言实现)
|
5月前
|
算法 自然语言处理 Rust
【算法】16. 最接近的三数之和(多语言实现)
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。
|
4月前
|
机器学习/深度学习 数据采集 算法
【机器学习】CART决策树算法的核心思想及其大数据时代银行贷款参考案例——机器认知外界的重要算法
【机器学习】CART决策树算法的核心思想及其大数据时代银行贷款参考案例——机器认知外界的重要算法
|
6月前
|
自然语言处理 Rust 算法
【算法】15. 三数之和(多语言实现)
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组。
|
6月前
|
自然语言处理 Rust 算法
【算法】14. 最长公共前缀(多语言实现)
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。
|
6月前
|
自然语言处理 Rust 算法
【算法】11. 盛最多水的容器(多语言实现)
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明: 你不能倾斜容器。
【算法】11. 盛最多水的容器(多语言实现)
|
6月前
|
算法 Java
Java实现银行家算法
Java实现银行家算法
48 0
|
6月前
|
自然语言处理 Rust 算法
【算法】12. 整数转罗马数字(多语言实现)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而