comments | difficulty | edit_url | rating | source | tags | ||||
---|---|---|---|---|---|---|---|---|---|
true |
中等 |
1280 |
第 274 场周赛 Q2 |
|
银行内部的防盗安全装置已经激活。给你一个下标从 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'
我们可以逐行统计每行的安全设备数量,如果当前行没有安全设备,直接跳过,否则我们将当前行的安全设备数量乘以前一行的安全设备数量,累加到答案中。然后更新前一行的安全设备数量为当前行的安全设备数量。
时间复杂度
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
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;
}
}
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;
}
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
}
}
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;
}