V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hakunamatata11
V2EX  ›  推广

九章算法 | 腾讯面试题:和相同的二元子数组

  •  
  •   hakunamatata11 · 2021-02-20 12:02:30 +08:00 · 503 次点击
    这是一个创建于 1375 天前的主题,其中的信息可能已经有所发展或是发生改变。

    描述

    在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。

    • A.length <= 30000
    • 0 <= S <= A.length
    • A[i] 为 0 或 1

    [在线评测地址](https://www.lintcode.com/problem/binary-subarrays-with-sum/?utm_source=sc-zhihuzl-sy)

    样例 1

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

    样例 2

    Input: A = [0,0,0,0,0,0,1,0,0,0], S = 0
    Output: 27
    Explanation: 
    And 27 subarrays for S.
    
    

    题解

    前缀和:定义一个数组 sumN+1,si表示数组 A 中前 i 个元素之和,然后遍历 sum 数组,计算 si+S(含义:前 i 个元素之和是 si,找和为 S 的子数组个数)。求 si+S 的个数

    public class Solution {
        /**
         * @param A: an array
         * @param S: the sum
         * @return: the number of non-empty subarrays
         */
        public int numSubarraysWithSum(int[] A, int S) {
            // Write your code here.
            if (A == null || A.length == 0) {
                return 0;
            }
            int prefixSum = 0;
            int res = 0;
            // counts[i] means the number of prefixSum = i
            int[] counts = new int[A.length + 1];
            counts[0] = 1;
            for (int i = 0; i < A.length; i++) {
                prefixSum += A[i];
                if (prefixSum >= S) {
                    res += counts[prefixSum - S];
                }
                counts[prefixSum]++;
            }
            return res;
        }
    }
    
    

    [更多题解参考](https://www.jiuzhang.com/solution/binary-subarrays-with-sum/?utm_source=sc-zhihuzl-sy )

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5943 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 01:51 · PVG 09:51 · LAX 17:51 · JFK 20:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.