给你一个整数数组 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