【leetcode】- Binary Subarrays With Sum(二进制子数组的和问题)

1、题目描述

In an array A of 0s and 1s, how many non-empty subarrays have sum S?

Example 1:

Input: A = [1,0,1,0,1], S = 2
Output: 4
Explanation:
The 4 subarrays are bolded below:
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]
[1,0,1,0,1]

Note:

   1.A.length <= 30000
   2.0 <= S <= A.length
   3.A[i] is either 0 or 1.

2、问题描述:

  • 一个二进制数组,求数组中可以可以组成和为S的子数组有多少个。

3、问题关键:

  • 不能用n^2的做法,因为n<= 3000.
  • 前缀和。
  • 看有多少个j,使s[i] - s[j] = s.
  • 枚举i, s[i] - s[j] = s, s[i] - s = s[j] =>f[s[i] - s]。
  • 一句话也就是说前面到底有多少个前缀可以使s[i] - s[j] = s.

4、C++代码:

/*
1.前缀和 s[i]  = A[0] + A[1] + ... + A[i]
2.f[i] 表示当前有多少个j, 满足s[j] = i, 表示s[] 里面有多少个数的和为i。
3.枚举i, s[i] - s[j] = s, s[i] - s =  s[j] =>f[s[i] - s] 
*/
class Solution {
public:
    int numSubarraysWithSum(vector<int>& A, int S) {
        int n = A.size();
        vector<int> sum(n + 1, 0), f(n + 1, 0);
        
        for (int i = 0; i < n; i ++) sum[i + 1] = sum[i] + A[i];//前n项和,不用考虑边界问题,将sum[0] = 0;
        
        f[0] = 1;//因为sum[0] = 0,所以肯定有一个符合。
        int res = 0;
        for (int i = 1; i <= n; i ++) {
            if (sum[i] >= S) res += f[sum[i] - S] ;//加上前面总共有多少个和为s[i] - S的。
            f[sum[i]] ++;//f[j]表示的就是将和为sum[i] 的记录到f里面,和为sum[i]可能有多个。
        }
        return res;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,899评论 0 2
  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 7,202评论 0 3
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,174评论 0 2
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 5,950评论 0 2
  • 孟母堂设计暗合中国古代文明的精华,含而不露,聚千年儒道文明,集数百年晋商精神,胡中海自幼秉承:汇百家之所长,创独家...
    每个人的孟母堂阅读 3,770评论 0 1

友情链接更多精彩内容