[lintcode]206. 区间求和 I

37 篇文章 0 订阅

链接:https://www.lintcode.com/zh-cn/problem/interval-sum/

给定一个整数数组(下标由 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 SegmentTreeNode33{ 
public:
    int start,end; 
    long long sum; 
    SegmentTreeNode33* right,*left; 
    SegmentTreeNode33(int start,int end){ 
        this->start=start; 
        this->end=end; 
        this->sum=0; 
        this->left=this->right=NULL;
    } 
};

class Solution {
public:
    /**
     * @param A: An integer list
     * @param queries: An query list
     * @return: The result list
     */
     
     
     //线段树构造;
    SegmentTreeNode33* build(int start,int end,vector<int>& A){
     
        //vector<int>& A一定要加引用,否则,每次调用函数都要拷贝容器很耗时!!!
        if(start>end) 
            return NULL; 
        SegmentTreeNode33* root= new SegmentTreeNode33(start,end); 
        if(start!=end){ 
            int mid=start+(end-start)/2; 
            root->left=build(start,mid,A); 
            root->right=build(mid+1,end,A); 
            root->sum=root->left->sum+root->right->sum; 
        }else 
            root->sum=A[start]; 
        return root;     
    }
    
    long long query(SegmentTreeNode33* root,int start,int end){ 
        if(root==NULL||start>end) 
            return 0; 
        if(start<=root->start&&end>=root->end) 
            return root->sum; 
        int mid=(root->start+root->end)/2; 
        if(start>mid) 
            return query(root->right,start,end); 
        else if(end<mid+1) 
            return query(root->left,start,end); 
        else 
            return query(root->right,mid+1,end)+query(root->left,start,mid);     
    }
     
    vector<long long> intervalSum(vector<int> &A, vector<Interval> &queries) {
        // write your code here
        vector<long long> res; 
        SegmentTreeNode33* root=build(0,A.size()-1,A); 
        for(Interval q:queries){
            res.push_back(query(root,q.start,q.end));
        }
        return res;      
        
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值