[LeetCode] 2348. Number of Zero-Filled Subarrays

Given an integer array nums, return the number of subarrays filled with 0.

A subarray is a contiguous non-empty sequence of elements within an array.

Example 1:
Input: nums = [1,3,0,0,2,0,0,4]
Output: 6
Explanation:
There are 4 occurrences of [0] as a subarray.
There are 2 occurrences of [0,0] as a subarray.
There is no occurrence of a subarray with a size more than 2 filled with 0. Therefore, we return 6.

Example 2:
Input: nums = [0,0,0,2,0,0]
Output: 9
Explanation:
There are 5 occurrences of [0] as a subarray.
There are 3 occurrences of [0,0] as a subarray.
There is 1 occurrence of [0,0,0] as a subarray.
There is no occurrence of a subarray with a size more than 3 filled with 0. Therefore, we return 9.

Example 3:
Input: nums = [2,10,2019]
Output: 0
Explanation: There is no subarray filled with 0. Therefore, we return 0.

Constraints:
1 <= nums.length <= 105
-109 <= nums[i] <= 109

全 0 子数组的数目。

给你一个整数数组 nums ,返回全部为 0 的 子数组 数目。

子数组 是一个数组中一段连续非空元素组成的序列。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-zero-filled-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

这是一道数学题,也可以用动态规划做。我参考了这个帖子

具体的思路是如果我们当前位置上遇到的是一个 0,我们就把当前这个 0 当做子数组的结尾,来统计以当前这个 0 为结尾的符合题意的子数组有多少。举个例子,比如 [0, 0, 0, 0],我们设一个变量 count 记录当前遇到的连续的 0 的个数

当我们遇到第一个 0 的时候,count = 1, res += count

当我们遇到第二个 0 的时候,count = 2, res += count

这里 count 其实暗含了子数组的个数。

复杂度

时间O(n)
空间O(1)

代码

Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public long zeroFilledSubarray(int[] nums) {
long res = 0;
int n = nums.length;
int count = 0;
for (int i = 0; i < n; i++) {
if (nums[i] == 0) {
count++;
res += count;
} else {
count = 0;
}
}
return res;
}
}

[LeetCode] 2348. Number of Zero-Filled Subarrays
https://shurui91.github.io/posts/16359.html
Author
Aaron Liu
Posted on
March 21, 2023
Licensed under