0
点赞
收藏
分享

微信扫一扫

327. 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.

思路:
使用合并排序发实现分治策略。

class Solution {
private int sort(long[] sums, int from, int to, int lower, int upper) {
if (from > to)
return 0;
if (from == to)
return (lower <= sums[from] && sums[from] <= upper) ? 1 : 0;
int count = 0;
int m = (from + to) / 2;
count = sort(sums, from, m, lower, upper) + sort(sums, m+1, to, lower, upper);
for(int i=from, j=m+1, k=m+1; i<=m; i++) {
while (j<=to && sums[j] - sums[i] < lower) j++;
while (k<=to && sums[k] - sums[i] <= upper) k++;
count += k - j;
}
long[] merged = new long[to-from+1];
int l=from, r=m+1;
for(int i=0, j=from, k=m+1; i<merged.length; i++) {
if (j>m) merged[i] = sums[k++];
else if (k>to) merged[i] = sums[j++];
else if (sums[j] <= sums[k]) merged[i] = sums[j++];
else merged[i] = sums[k++];
}
System.arraycopy(merged, 0, sums, from, merged.length);
return count;
}
public int countRangeSum(int[] nums, int lower, int upper) {
if (nums == null || nums.length == 0)
return 0;
long[] sums = new long[nums.length];
sums[0] = nums[0];
for(int i=1; i<nums.length; i++)
sums[i] = sums[i-1] + nums[i];
return sort(sums, 0, sums.length-1, lower, upper);
}
}


举报

相关推荐

0 条评论