在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。
示例:
输入:A = [1,0,1,0,1], S = 2
输出:4
解释:
如下面黑体所示,有 4 个满足题目要求的子数组:
[1,0,1, 0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
提示:
A.length <= 30000
0 <= S <= A.length
A[i] 为 0 或 1
思路1
//930. 和相同的二元子数组
/*
* O(N^2)
* */
public int numSubarraysWithSum(int[] A, int S) {
int[] a = A;
int s = S;
int res = 0;
for (int i = 0; i < a.length; i++) {
int cur = s - a[i];
if (cur == 0) {
res++;
for (int j = i + 1; j < a.length; j++) {
if (a[j] == 0)
res++;
else {
break;
}
}
}else{
for(int j=i+1;j<a.length;j++){
cur-=a[j];
if(cur==0){
res++;
for (j+=1; j < a.length; j++) {
if (a[j] == 0)
res++;
else {
break;
}
}
break;//注意这里,要加break哦
}
}
}
}
return res;
}
思路2 :没懂~~~
//别人的思路,好屌,O(N),没懂
public int numSubarraysWithSum2(int[] A, int S) {
int psum = 0, res = 0, count[] = new int[A.length + 1];
count[0] = 1;
for (int i : A) {
psum += i;
if (psum >= S)
res += count[psum - S];
count[psum]++;
}
return res;
}
本文探讨了在一个由0和1构成的数组中寻找所有和等于给定值S的非空子数组的方法。提供了两种解决方案,一种是直观但效率较低的时间复杂度为O(N^2)的方法;另一种则是更高效的O(N)方法,使用前缀和和哈希表来实现。
369

被折叠的 条评论
为什么被折叠?



