前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LintCode 207. 区间求和 II(线段树)

LintCode 207. 区间求和 II(线段树)

作者头像
Michael阿明
发布2020-07-13 17:14:38
4010
发布2020-07-13 17:14:38
举报

1. 题目

在类的构造函数中给一个整数数组, 实现两个方法 query(start, end)modify(index, value):

  • 对于 query(start, end), 返回数组中下标 start 到 end 的 和。
  • 对于 modify(index, value), 修改数组中下标为 index 上的数为 value.
代码语言:javascript
复制
样例1
输入:
[1,2,7,8,5]
[query(0,2),modify(0,4),query(0,1),modify(2,1),query(2,4)]
输出: [10,6,14]
说明:
给定数组 A = [1,2,7,8,5].
在query(0, 2)后, 1 + 2 + 7 = 10,
在modify(0, 4)后, 将 A[0] 修改为 4, A = [4,2,7,8,5].
在query(0, 1)后, 4 + 2 = 6.
在modify(2, 1)后, 将 A[2] 修改为 1,A = [4,2,1,8,5].
After query(2, 4), 1 + 8 + 5 = 14.

样例2
输入:
[1,2,3,4,5]
[query(0,0),query(1,2),quert(3,4)]
输出: [1,5,9]
说明:
1 = 1
2 + 3 = 5
4 + 5 = 9

挑战
query 和 modify 的时间复杂度需要为O(logN).

2. 解题

代码语言:javascript
复制
class node
{
public:
    int sum;
    int start, end;
    node *left, *right;
    node(int s, int e, int v):start(s),end(e),sum(v)
    {
        left = right = NULL;
    }

    static node* build(vector<int>& A, int l, int r)
    {
        if(l > r)
            return NULL;
        node* head = new node(l,r,A[l]);
        if(l == r)
            return head;
        int mid = l+((r-l)>>1);
        head->left = build(A,l,mid);
        head->right = build(A,mid+1,r);
        head->sum = 0;
        if(head->left)
            head->sum += head->left->sum;
        if(head->right)
            head->sum += head->right->sum;
        return head;
    }

    static long long query(node* head, int s, int e)
    {
        if(s > head->end || e < head->start)
            return 0;
        if(head->start >= s && head->end <= e)
            return head->sum;
        int vl = query(head->left, s, e);
        int vr = query(head->right,s, e);
        return vl+vr;
    }

    static void modify(node* head, int id, int val)
    {
        if(head->start == head->end)
        {
            head->sum = val;
            return;
        }
        int mid = (head->start + head->end)/2;
        if(id > mid)
            modify(head->right, id, val);
        else
            modify(head->left, id, val);
        head->sum = 0;
        if(head->left)
            head->sum += head->left->sum;
        if(head->right)
            head->sum += head->right->sum;
    }
};
class Solution {
    node *head;
public:
    Solution(vector<int> A) {
        head = node::build(A,0,A.size()-1);
    }

    long long query(int start, int end) {
        return node::query(head, start,end);
    }

    void modify(int index, int value) {
        node::modify(head, index,value);
    }
};

100% 数据通过测试

总耗时: 1086ms

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档