1. 程式人生 > >LeetCode-Binary Subarrays With Sum

LeetCode-Binary Subarrays With Sum

Description: 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:

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

題意:給定一個只包含數字0和1的陣列A, 和一個整數S,計算陣列A的所有子陣列中滿足1的個數為S的數量;

解法:定義一個新的陣列sumOne,用來儲存陣列A中當前下標位置處1的個數(即從下標0開始到當前下標位置處1的個數);這樣,我們只要找到sumOne中所有滿足兩個位置處的1的個數差為S的情況即可; 例如:對於陣列A = [1,0,1,0,1],我們可以得到陣列sumOne = [1,1,2,2,3] ;

Java
class Solution {
    public int numSubarraysWithSum(int[] A, int S) {
        if (A.length == 0) return 0;
        int result = 0;
        int[] sumOne = new int[A.length];
        int st = 0;
        int ed = 0;
        sumOne[0] = A[0] == 1 ? 1 : 0;
        for (int i = 1; i < A.length; i++) {
            sumOne[i] = A[i] == 1 ? 1 + sumOne[i - 1] : sumOne[i - 1];
        }
        while (st < A.length) {
            ed = st;
            while (ed < A.length) {
                int sum = st == 0 ? sumOne[ed] : sumOne[ed] - sumOne[st - 1];
                if (sum > S) break;
                result = sum == S ? result + 1 : result;
                ed++;
            }
            st++;
        }
        return result;
    }
}