首页 > 其他分享 >力扣---2348. 全 0 子数组的数目

力扣---2348. 全 0 子数组的数目

时间:2023-01-18 00:34:15浏览次数:43  
标签:--- tem nums int res 2348 long 力扣 数组

给你一个整数数组 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 <= 105
    -109 <= nums[i] <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-zero-filled-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

第一遍的思路是这样的:

遍历数组,保存其连续0的个数,连续0结束后进行一次结算。

代码如下:

class Solution {
    public long zeroFilledSubarray(int[] nums) {
        long res = 0L;
        boolean ju = (nums[0] == 0);
        long tem = 0L;
        for (int i : nums) {
            if (ju) {
                if (i == 0) {
                    tem ++;
                } else {
                    res += tool(tem);
                    tem = 0;
                    ju = false;
                }
            } else {
                if (i == 0) {
                    tem ++;
                    ju = true;
                }
            }
        }
        return res + tool(tem);
    }
    private long tool (long num) {
        return (num * (num + 1)) / 2;
    }
}

运行结果:

 

 

class Solution {
    public long zeroFilledSubarray(int[] nums) {
        long res = 0;
        int tem = 0;
        for (int i : nums) {
            if (i == 0) {
                tem++;
                res += tem;
            } else {
                tem = 0;
            }
        }
        return res;
    }
}

 

 试着优化了下,看了评论的题解才发现自己走了误区,多了一些不必要的步骤

优化后的代码如下:

运行结果:

优化

 

标签:---,tem,nums,int,res,2348,long,力扣,数组
From: https://www.cnblogs.com/allWu/p/17058988.html

相关文章