算法leetcode每日一练2125. 银行中的激光束数量

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法leetcode每日一练2125. 银行中的激光束数量相关的知识,希望对你有一定的参考价值。


文章目录


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

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

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

  • 两个设备位于两个 不同行 r 1 r_1 r1 r 2 r_2 r2 ,其中 r 1 r_1 r1 < r 2 r_2 r2
  • 满足 r 1 r_1 r1 < i < r 2 r_2 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://le-yi.blog.csdn.net/ 博客原创~


以上是关于算法leetcode每日一练2125. 银行中的激光束数量的主要内容,如果未能解决你的问题,请参考以下文章

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

算法leetcode每日一练1365. 有多少小于当前数字的数字

算法leetcode每日一练1365. 有多少小于当前数字的数字

算法千题案例每日一练LeetCode打卡——104.两句话中的不常见单词

算法千题案例每日一练LeetCode打卡——104.两句话中的不常见单词

算法leetcode每日一练2161. 根据给定数字划分数组