[Hard] 327. Count of Range Sum
Given an integer array nums and two integers lower and upper, 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 inclusive, where i <= j.
Thinking Process
- Prefix Sum Transformation: Convert subarray sum problem to prefix sum difference problem
- Divide & Conquer: Sort prefix sums, count pairs using two pointers
- Segment Tree: Maintain count of prefix sums, query range for each new prefix
- Clarify if the array is sorted, has negatives, or allows duplicates.
- Prefix sums answer range queries; hash maps answer pair/count queries.
- In-place tricks use swap/write index instead of extra arrays.
Common Approaches
Typical techniques for this pattern:
| Approach | Time | Space | Notes |
|---|---|---|---|
| Prefix sum | O(n) | O(n) | Range queries, subarray sum |
| Sort + scan | O(n log n) | O(1) | Intervals, meeting rooms |
| Kadane’s algorithm | O(n) | O(1) | Maximum subarray |
| Hash map counting (this problem) | O(n) | O(n) | Frequency, two-sum variants |
Examples
Example 1:
Input: nums = [-2,5,-1], lower = -2, upper = 2
Output: 3
Explanation: The three ranges are: [0,0], [2,2], and [0,2] and their respective sums are: -2, -1, 2.
Example 2:
Input: nums = [0], lower = 0, upper = 0
Output: 1
Constraints
1 <= nums.length <= 10^5-2^31 <= nums[i] <= 2^31 - 1-10^5 <= lower <= upper <= 10^5
Common Mistakes
- Single element:
nums = [0],lower = 0,upper = 0→ return1 - All negative:
nums = [-2,-1],lower = -3,upper = -1→ count valid ranges - Large numbers: Use
long longto prevent overflow - Empty ranges: Handle cases where no valid ranges exist
-
Overflow prevention: Prefix sums can exceed
intrange - Integer overflow: Not using
long longfor prefix sums# WRONG: prefix = [0] * n + 1, 0; # ❌ May overflow - Off-by-one errors: Incorrect prefix sum indexing
- Missing prefix[0]: Forgetting to include empty prefix (sum = 0)
- Wrong range: Confusing
prefix[j] - upperandprefix[j] - lower - Memory leaks: Not managing segment tree nodes properly (though solution doesn’t delete)
Related Problems
- LC 327: Count of Range Sum - This problem
- LC 315: Count of Smaller Numbers After Self - Similar divide & conquer approach
- LC 493: Reverse Pairs - Count pairs with condition
- LC 307: Range Sum Query - Mutable - Segment tree for range sum
- LC 303: Range Sum Query - Immutable - Prefix sum basics
Key Takeaways
- Prefix Sum Transformation: Convert subarray sum problem to prefix sum difference problem
- Range Condition:
lower <= prefix[j] - prefix[i] <= upperbecomesprefix[j] - upper <= prefix[i] <= prefix[j] - lower - Two Approaches:
- Divide & Conquer: Sort prefix sums, count pairs using two pointers
- Segment Tree: Maintain count of prefix sums, query range for each new prefix
- Dynamic Node Creation: Reduces memory for sparse segment trees
References
- LC 327: Count of Range Sum on LeetCode
- LeetCode Discuss — LC 327: Count of Range Sum
- LeetCode Editorial (may require premium)