930. 和相同的二元子数组
Posted ai52learn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了930. 和相同的二元子数组相关的知识,希望对你有一定的参考价值。
给你一个二元数组 nums ,和一个整数 goal ,请你统计并返回有多少个和为 goal 的 非空 子数组。
子数组 是数组的一段连续部分。
示例 1:
输入:nums = [1,0,1,0,1], goal = 2
输出:4
解释:
有 4 个满足题目要求的子数组:[1,0,1]、[1,0,1,0]、[0,1,0,1]、[1,0,1]
示例 2:
输入:nums = [0,0,0,0,0], goal = 0
输出:15
提示:
1 <= nums.length <= 3 * 104
nums[i] 不是 0 就是 1
0 <= goal <= nums.length
class Solution {
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int l = 0, r = 0,cnt=nums[0],ret=0,a[30001]={0},b[30001]={0};
for(int i =0;i<nums.size();i++)
{
int j = i;
while(j<nums.size()&&nums[j]==0)
{
a[i]++;
j++;
}
if(a[i]>0)
{
b[j-1]=a[i];
i = j;
}
}
if(!goal)
{
for(int i =0;i<nums.size();i++)
if(a[i]) ret+=a[i]*(a[i]-1)/2+a[i];
return ret;
}
while(l<nums.size()&&nums[l]==0) l++;
r = l;
if(l<nums.size()) cnt = nums[l];
int gg = 0;
while(l<nums.size())
{
while(r<nums.size()&&cnt<goal)
{
cnt+=nums[++r];
}
if(r>=nums.size()) break;
if(goal==cnt)
{
int t = 1;
if(l-1>=0&&b[l-1]>0) t*=(b[l-1]+1);
if(r+1<=nums.size()&&a[r+1]>0) t*=(a[r+1]+1);
ret+=t;
}
cnt -= nums[l++];
while(l<nums.size()&&nums[l]==0) l++;
}
return ret;
}
};
以上是关于930. 和相同的二元子数组的主要内容,如果未能解决你的问题,请参考以下文章
[M前缀和] lc930. 和相同的二元子数组(滑动窗口+双指针+哈希优化)
LeetCode 930 和相同的二元子数组[动态规划 前缀和] HERODING的LeetCode之路
Leetcode-930 Binary Subarrays With Sum(和相同的二元子数组)
930. 和相同的二元子数组/238. 除自身以外数组的乘积/1262. 可被三整除的最大和/NC90 设计getMin功能的栈/NC67连续子数组的最大和/NC115 栈和排序