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 博客原创~