题目描述
银行内部的防盗安全装置已经激活。给你一个下标从 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'
解法
方法一:逐行统计
我们可以逐行统计每行的安全设备数量,如果当前行没有安全设备,直接跳过,否则我们将当前行的安全设备数量乘以前一行的安全设备数量,累加到答案中。然后更新前一行的安全设备数量为当前行的安全设备数量。
时间复杂度 $O(m \times n)$,其中 $m$ 和 $n$ 分别为行数和列数。空间复杂度 $O(1)$。
| class Solution:
def numberOfBeams(self, bank: List[str]) -> int:
ans = pre = 0
for row in bank:
if (cur := row.count("1")) > 0:
ans += pre * cur
pre = cur
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | class Solution {
public int numberOfBeams(String[] bank) {
int ans = 0, pre = 0;
for (String row : bank) {
int cur = 0;
for (int i = 0; i < row.length(); ++i) {
cur += row.charAt(i) - '0';
}
if (cur > 0) {
ans += pre * cur;
pre = cur;
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | class Solution {
public:
int numberOfBeams(vector<string>& bank) {
int ans = 0, pre = 0;
for (auto& row : bank) {
int cur = count(row.begin(), row.end(), '1');
if (cur) {
ans += pre * cur;
pre = cur;
}
}
return ans;
}
};
|
| func numberOfBeams(bank []string) (ans int) {
pre := 0
for _, row := range bank {
if cur := strings.Count(row, "1"); cur > 0 {
ans += pre * cur
pre = cur
}
}
return
}
|
| function numberOfBeams(bank: string[]): number {
let [ans, pre] = [0, 0];
for (const row of bank) {
const cur = row.split('1').length - 1;
if (cur) {
ans += pre * cur;
pre = cur;
}
}
return ans;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | impl Solution {
pub fn number_of_beams(bank: Vec<String>) -> i32 {
let mut ans = 0;
let mut pre = 0;
for row in bank {
let cur = row.chars().filter(|&c| c == '1').count() as i32;
if cur > 0 {
ans += pre * cur;
pre = cur;
}
}
ans
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | int numberOfBeams(char** bank, int bankSize) {
int ans = 0, pre = 0;
for (int i = 0; i < bankSize; ++i) {
int cur = 0;
for (int j = 0; bank[i][j] != '\0'; ++j) {
if (bank[i][j] == '1') {
cur++;
}
}
if (cur) {
ans += pre * cur;
pre = cur;
}
}
return ans;
}
|