327. 区间和的个数
给定一个整数数组 nums
,返回区间和在 [lower, upper]
之间的个数,包含 lower
和 upper
。
区间和 S(i, j)
表示在 nums
中,位置从 i
到 j
的元素之和,包含 i
和 j
(i
≤ j
)。
说明:
最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。
示例:
输入: nums =[-2,5,-1]
, lower =-2
, upper =2
, 输出: 3 解释: 3个区间分别是:[0,0]
,[2,2]
,[0,2],
它们表示的和分别为:-2, -1, 2。
use merge sort
class Solution { public: int countRangeSum(vector<int>& nums, int lower, int upper) { vector<long long> sum(nums.size() + 1, 0); for (int i = 0; i < nums.size(); ++i) sum[i + 1] = sum[i] + nums[i]; return merge(sum, 0, sum.size(), lower, upper); } int merge(vector<long long>& nums, int start, int end, int lower, int upper) { if (end - start <= 1) return 0; int middle = start + (end - start) / 2; int count = merge(nums, start, middle, lower, upper) + merge(nums, middle, end, lower, upper); int small = middle; int between = middle; for (int i = start; i < middle; ++i) { while (small < end && nums[small] - nums[i] < lower) ++small; while (between < end && nums[between] - nums[i] <= upper) ++between; count += between - small; } inplace_merge(nums.begin() + start, nums.begin() + middle, nums.begin() + end); return count; } };