LeetCode 327. Count of Range Sum

本文介绍了一个高效的算法,用于计算整数数组中所有范围和落在指定区间内的数量。该算法使用了分治法和二分查找技术,避免了朴素算法的O(n²)复杂度,通过预处理前缀和及排序过程中的巧妙计数实现了更优的时间复杂度。

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))     
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值