题目
https://leetcode-cn.com/problems/binary-subarrays-with-sum/
方法一:滑动窗口
[ l1,l2 ]有( l2-l1+1 )个
代码
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
int len=nums.length;
if(len==0)
return 0;
int res=0;
int left1=0,left2=0,right=0;
int sum1=0,sum2=0;
while(right<len){
sum1+=nums[right];
while(left1<=right&&sum1>goal){//找小于等于
sum1-=nums[left1];
left1++;
}
sum2+=nums[right];
while(left2<=right&&sum2>=goal){//找小于
sum2-=nums[left2];
left2++;
}
res+=left2-left1;
right++;
}
return res;
}
}
复杂度
时间O(N)
空间O(1)
方法二:哈希表
代码
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
int sum = 0;
Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();
int ret = 0;
for (int num : nums) {
cnt.put(sum, cnt.getOrDefault(sum, 0) + 1);
sum += num;
ret += cnt.getOrDefault(sum - goal, 0);
}
return ret;
}
}
复杂度
方法三:我的方法
代码
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
int len=nums.length;
if(len==0)
return 0;
int res=0;
for(int i=1;i<len;i++){
nums[i]=nums[i]+nums[i-1];//前缀和
}
for(int i=0;i<len;i++){
if(nums[i]==goal){
res++;
}
for(int j=i+1;j<len;j++){
if(nums[j]-nums[i]==goal){
res++;
}
}
}
return res;
}
}