[LeetCode] Count of Range Sum 区间和计数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] Count of Range Sum 区间和计数相关的知识,希望对你有一定的参考价值。
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
.
Credits:
Special thanks to @dietpepsi for adding this problem and creating all test cases.
解法一:
class Solution { public: int countRangeSum(vector<int>& nums, int lower, int upper) { int res = 0; long long sum = 0; multiset<long long> sums; sums.insert(0); for (int i = 0; i < nums.size(); ++i) { sum += nums[i]; res += distance(sums.lower_bound(sum - upper), sums.upper_bound(sum - lower)); sums.insert(sum); } return res; } };
解法二:
class Solution { public: int countRangeSum(vector<int>& nums, int lower, int upper) { vector<long> sums(nums.size() + 1, 0); for (int i = 0; i < nums.size(); ++i) { sums[i + 1] = sums[i] + nums[i]; } return countAndMergeSort(sums, 0, sums.size(), lower, upper); } int countAndMergeSort(vector<long> &sums, int start, int end, int lower, int upper) { if (end - start <= 1) return 0; int mid = start + (end - start) / 2; int cnt = countAndMergeSort(sums, start, mid, lower, upper) + countAndMergeSort(sums, mid, end, lower, upper); int j = mid, k = mid, t = mid; vector<int> cache(end - start, 0); for (int i = start, r = 0; i < mid; ++i, ++r) { while (k < end && sums[k] - sums[i] < lower) ++k; while (j < end && sums[j] - sums[i] <= upper) ++j; while (t < end && sums[t] < sums[i]) cache[r++] = sums[t++]; cache[r] = sums[i]; cnt += j - k; } copy(cache.begin(), cache.begin() + t - start, sums.begin() + start); return cnt; } };
参考资料:
https://leetcode.com/discuss/79083/share-my-solution
https://leetcode.com/discuss/79632/multiset-solution-100ms-binary-search-tree-180ms-mergesort
https://leetcode.com/discuss/79907/summary-divide-conquer-based-binary-indexed-based-solutions
LeetCode All in One 题目讲解汇总(持续更新中...)
以上是关于[LeetCode] Count of Range Sum 区间和计数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 327. Count of Range Sum
leetcode327. Count of Range Sum