[继续] Prefix Sum 总结

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 BuildSegment 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;
    }
}
发布了663 篇原创文章 · 获赞 13 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u013325815/article/details/105048384
今日推荐