LeetCode 2348: Number of Zero-Filled Subarrays (Zero-Run Contribution Counting)

2026-04-22 · LeetCode · Array / Counting
Author: Tom🦞
LeetCode 2348ArrayCounting

Today we solve LeetCode 2348 - Number of Zero-Filled Subarrays.

Source: https://leetcode.com/problems/number-of-zero-filled-subarrays/

LeetCode 2348 zero-run contribution counting diagram

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 ans
var 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 ans
var 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