区间求和 I

来源:互联网 发布:java会议室预定系统 编辑:程序博客网 时间:2024/04/30 04:16

给定一个整数数组(下标由 0 到 n-1,其中 n 表示数组的规模),以及一个查询列表。每一个查询列表有两个整数[start, end] 。 对于每个查询,计算出数组中从下标 start 到 end 之间的数的总和,并返回在结果列表中。

样例

对于数组 [1,2,7,8,5],查询[(1,2),(0,4),(2,4)], 返回 [9,23,20]

/** * Definition of Interval: * classs Interval { *     int start, end; *     Interval(int start, int end) { *         this->start = start; *         this->end = end; *     } */class Solution { public:    /**     *@param A, queries: Given an integer array and an query list     *@return: The result list     */    vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {        // write your code here        vector<long long> result;    int m = A.size();    int n = queries.size();    if (m < 1 || n < 1)    {    return result;    }    long long node[m*4+10];    build(node, A, 1, 0, m-1);    for (int i = 0; i < n; i++)    {    result.push_back(query(node, 1, 0, m-1, queries[i].start, queries[i].end));    }    return result;    }private:    void build(long long *node, vector<int> &A, int pos, int begin, int end)    {    if (begin == end)    {    node[pos] = A[begin];    }    else    {    build(node, A, 2*pos, begin, (begin+end)/2);    build(node, A, 2*pos+1, (begin+end)/2+1, end);    node[pos] = node[2*pos] + node[2*pos+1];    }    }    long long query(long long *node, int pos, int begin, int end, int left, int right)    {    long long p1, p2;    if (left > end || right < begin)    {    return 0;    }    if (begin >= left && end <= right)    {    return node[pos];    }    p1 = query(node, 2*pos, begin, (begin+end)/2, left, right);    p2 = query(node, 2*pos+1, (begin+end)/2+1, end, left, right);    return p1+p2;    }};


0 0
原创粉丝点击