返回

LeetCode 2348:Python 版「零填充子数组的数量」题解

后端

题目概述

LeetCode 2348 题「零填充子数组的数量」给定一个整数数组 nums,我们需要统计其中全为 0 的连续子数组的个数。

Python 实现

def zeroFilledSubarray(nums):
    """
    统计数组中全为 0 的连续子数组的个数。

    :param nums: 输入整数数组
    :return: 全为 0 的连续子数组的个数
    """

    # 初始化子数组计数器
    subarray_count = 0

    # 遍历数组
    for i in range(len(nums)):
        # 如果当前元素为 0
        if nums[i] == 0:
            # 将子数组计数器加 1
            subarray_count += 1

            # 如果下一个元素不为 0,则重置计数器
            if i + 1 < len(nums) and nums[i + 1] != 0:
                subarray_count = 0

    # 返回子数组计数器
    return subarray_count


# 测试代码
nums = [0, 1, 0, 0, 1, 0, 1, 0, 0]
result = zeroFilledSubarray(nums)
print(result)  # 输出:4

优化技巧

为了使代码更简洁高效,我们可以使用一些优化技巧:

  • 使用变量 current_count 来记录当前全 0 子数组的长度,这样可以减少不必要的循环。
  • 使用变量 last_zero_index 来记录上一个 0 元素的索引,这样可以快速判断当前子数组是否为全 0 子数组。

优化后的代码如下:

def zeroFilledSubarray(nums):
    """
    统计数组中全为 0 的连续子数组的个数。

    :param nums: 输入整数数组
    :return: 全为 0 的连续子数组的个数
    """

    # 初始化子数组计数器
    subarray_count = 0

    # 初始化当前全 0 子数组长度
    current_count = 0

    # 初始化上一个 0 元素的索引
    last_zero_index = -1

    # 遍历数组
    for i in range(len(nums)):
        # 如果当前元素为 0
        if nums[i] == 0:
            # 如果上一个元素不为 0,则重置当前全 0 子数组长度
            if last_zero_index != i - 1:
                current_count = 0

            # 更新上一个 0 元素的索引
            last_zero_index = i

            # 将当前全 0 子数组长度加 1
            current_count += 1

            # 将子数组计数器加 1
            subarray_count += current_count

    # 返回子数组计数器
    return subarray_count


# 测试代码
nums = [0, 1, 0, 0, 1, 0, 1, 0, 0]
result = zeroFilledSubarray(nums)
print(result)  # 输出:4

总结

这道题考察的是统计全 0 子数组的个数。解题思路是使用循环和条件判断来统计全 0 子数组的个数。此外,还提供了一些技巧来优化代码,使其更简洁高效。