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; } };

浙公网安备 33010602011771号