LeetCode 2348: Number of Zero-Filled Subarrays (Zero-Run Contribution Counting)
LeetCode 2348ArrayCountingToday we solve LeetCode 2348 - Number of Zero-Filled Subarrays.
Source: https://leetcode.com/problems/number-of-zero-filled-subarrays/
English
Problem Summary
Given an integer array, count how many subarrays contain only zeros.
Key Insight
For each consecutive zero run of length L, the number of all-zero subarrays contributed by this run is L * (L + 1) / 2.
Algorithm
Scan once with a running zero length run.
- If current value is 0, increment run and add run to answer.
- Otherwise reset run = 0.
This works because each new zero extends all previous zero-only suffixes by one and adds one new subarray ending here.
Complexity Analysis
Time: O(n).
Space: O(1).
Reference Implementations (Java / Go / C++ / Python / JavaScript)
class Solution {
public long zeroFilledSubarray(int[] nums) {
long ans = 0L, run = 0L;
for (int x : nums) {
if (x == 0) {
run++;
ans += run;
} else {
run = 0L;
}
}
return ans;
}
}func zeroFilledSubarray(nums []int) int64 {
var ans, run int64
for _, x := range nums {
if x == 0 {
run++
ans += run
} else {
run = 0
}
}
return ans
}class Solution {
public:
long long zeroFilledSubarray(vector<int>& nums) {
long long ans = 0, run = 0;
for (int x : nums) {
if (x == 0) {
++run;
ans += run;
} else {
run = 0;
}
}
return ans;
}
};class Solution:
def zeroFilledSubarray(self, nums: list[int]) -> int:
ans = 0
run = 0
for x in nums:
if x == 0:
run += 1
ans += run
else:
run = 0
return ansvar zeroFilledSubarray = function(nums) {
let ans = 0;
let run = 0;
for (const x of nums) {
if (x === 0) {
run += 1;
ans += run;
} else {
run = 0;
}
}
return ans;
};中文
题目概述
给定一个整数数组,统计只包含 0 的子数组总数。
核心思路
对于连续零段长度 L,该段贡献的全零子数组数量为 L * (L + 1) / 2。
算法步骤
一次遍历维护连续零长度 run。
- 当前值为 0:run++,并把 run 加到答案。
- 当前值非 0:run = 0。
含义是每遇到一个新 0,就新增了以当前下标结尾的 run 个全零子数组。
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(1)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
class Solution {
public long zeroFilledSubarray(int[] nums) {
long ans = 0L, run = 0L;
for (int x : nums) {
if (x == 0) {
run++;
ans += run;
} else {
run = 0L;
}
}
return ans;
}
}func zeroFilledSubarray(nums []int) int64 {
var ans, run int64
for _, x := range nums {
if x == 0 {
run++
ans += run
} else {
run = 0
}
}
return ans
}class Solution {
public:
long long zeroFilledSubarray(vector<int>& nums) {
long long ans = 0, run = 0;
for (int x : nums) {
if (x == 0) {
++run;
ans += run;
} else {
run = 0;
}
}
return ans;
}
};class Solution:
def zeroFilledSubarray(self, nums: list[int]) -> int:
ans = 0
run = 0
for x in nums:
if x == 0:
run += 1
ans += run
else:
run = 0
return ansvar zeroFilledSubarray = function(nums) {
let ans = 0;
let run = 0;
for (const x of nums) {
if (x === 0) {
run += 1;
ans += run;
} else {
run = 0;
}
}
return ans;
};
Comments