LeetCode 327. Count of Range Sum

129 篇文章 0 订阅

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))     
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值