Count of Range Sum

Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.

Range sum S(i, j) is defined as the sum of the elements in nums between indices i and 
j (i ? j), inclusive.



Note:
A naive algorithm of O(n2) is trivial. You MUST do better than that.


Example:
Given nums = [-2, 5, -1], lower = -2, upper = 2,
Return 3.
The three ranges are : [0, 0], [2, 2], [0, 2] and their respective sums are: -2, -1, 2.

Credits:Special thanks to @dietpepsi for adding this problem and creating all test cases.

Solution

import java.util.Iterator;
import java.util.NavigableMap;
import java.util.TreeMap;
public class Solution {
    public int countRangeSum(int[] nums, int lower, int upper) {
        if (nums == null || nums.length == 0 || upper < lower) return 0;

        int size = nums.length;
        long[] cum = new long[size];
        cum[0] = nums[0];
        for (int i = 1; i < size; i++) {
            cum[i] = cum[i - 1] + nums[i];
        }

        TreeMap<Long, Integer> map = new TreeMap<>();
        map.put((long) 0,1);

        int result = 0;
        for (int i = 0; i < size; i++) {
            long lowerBound = cum[i] - upper;
            long higherBound = cum[i] - lower;

            NavigableMap<Long, Integer> navigableSet = map.subMap(lowerBound, true, higherBound, true);
            Iterator<Integer> iterator = navigableSet.values().iterator();
            while (iterator.hasNext()) {
                result += iterator.next();
            }

            map.merge(cum[i], 1, (a,b)->a+b);
        }

        return result;
    }

}

results matching ""

    No results matching ""