Interval Sum
Given an integer array (index from 0 to n-1, where n is the size of this array), and an query list. Each query has two integers [start, end]
. For each query, calculate the sum number between index start and end in the given array, return the result list.
Example
Example 1:
Input: array = [1,2,7,8,5], queries = [(0,4),(1,2),(2,4)]
Output: [23,9,20]
Example 2:
Input: array : [4,3,1,2], queries : [(1,2),(0,2)]
Output: [4,8]
Challenge
O(logN) time for each query
Notice
We suggest you finish problem Segment Tree Build, Segment Tree Query and Segment Tree Modify first.
思路:因为这个题目不需要modify数组操作,所以用prefix sum array就可以解决,O(N + M) N是数组大小,M是query次数;
注意:prefixsum一般都是用PrefixSum[n+1]的数组,prefix[0] = 0; 那么
因为i, j 是A里面的坐标,而prefixsum比A多了1;所以原来的sum[j] - sum[i-1]变成了
sum(i~j) = prefixsum(j + 1) - prefixsum(i);
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param A: An integer list
* @param queries: An query list
* @return: The result list
*/
public List<Long> intervalSum(int[] A, List<Interval> queries) {
List<Long> list = new ArrayList<Long>();
if(A == null || A.length == 0 || queries == null || queries.size() == 0){
return list;
}
long[] prefixsum = new long[A.length + 1];
prefixsum[0] = 0;
for(int i = 1; i <= A.length; i++) {
prefixsum[i] = prefixsum[i-1] + A[i - 1];
}
for(Interval interval: queries) {
int start = interval.start;
int end = interval.end;
list.add(prefixsum[end + 1] - prefixsum[start]);
}
return list;
}
}