Problem Statement
(Source) 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.
Tags: Divide and Conquer
, Binary Search Tree
.
Solution
class Solution(object):
def countRangeSum(self, nums, lower, upper):
"""
:type nums: List[int]
:type lower: int
:type upper: int
:rtype: int
"""
pre_sum = [0]
for num in nums:
pre_sum.append(pre_sum[-1] + num)
def help(first, lo, hi):
mid = (lo + hi) >> 1
if mid == lo:
return 0
count = help(first, lo, mid) + help(first, mid, hi)
i = j = mid
for left in first[lo : mid]:
while i < hi and first[i] - left < lower: i += 1
while j < hi and first[j] - left <= upper: j += 1
count += j - i
first[lo : hi] = sorted(first[lo : hi])
return count
return help(pre_sum, 0, len(pre_sum))