目标
给你一个整数数组 nums ,返回全部为 0 的 子数组 数目。
子数组 是一个数组中一段连续非空元素组成的序列。
示例 1:
输入:nums = [1,3,0,0,2,0,0,4]
输出:6
解释:
子数组 [0] 出现了 4 次。
子数组 [0,0] 出现了 2 次。
不存在长度大于 2 的全 0 子数组,所以我们返回 6 。
示例 2:
输入:nums = [0,0,0,2,0,0]
输出:9
解释:
子数组 [0] 出现了 5 次。
子数组 [0,0] 出现了 3 次。
子数组 [0,0,0] 出现了 1 次。
不存在长度大于 3 的全 0 子数组,所以我们返回 9 。
示例 3:
输入:nums = [2,10,2019]
输出:0
解释:没有全 0 子数组,所以我们返回 0 。
说明:
- 1 <= nums.length <= 10^5
- -10^9 <= nums[i] <= 10^9
思路
返回数组的全 0
子数组个数。
长度为 k
的子数组个数为 (1 + k) * k / 2
。可以使用贪心策略,如果当前元素是 0
找到以它为起点的最长连续 0
数组,计算子数组个数。
代码
/**
* @date 2025-08-19 8:54
*/
public class ZeroFilledSubarray2348 {
public long zeroFilledSubarray(int[] nums) {
long res = 0L;
int n = nums.length;
int i = 0;
while (i < n){
if (nums[i] != 0){
i++;
continue;
}
int start = i;
while (i < n && nums[i] == 0){
i++;
}
int cnt = i - start;
res += (1L + cnt) * cnt / 2;
}
return res;
}
}