#247 Segment Tree Query II

来源:互联网 发布:手机管理淘宝店铺 编辑:程序博客网 时间:2024/05/29 17:50

题目描述:

For an array, we can build a SegmentTree for it, each node stores an extra attribute count to denote the number of elements in the the array which value is between interval start and end. (The array may not fully filled by elements)

Design a query method with three parameters rootstartand end, find the number of elements in the in array's interval [startend] by the given root of value SegmentTree.

 Notice

It is much easier to understand this problem if you finished Segment Tree Buildand Segment Tree Query first.

Example

For array [0, 2, 3], the corresponding value Segment Tree is:

                     [0, 3, count=3]                     /             \          [0,1,count=1]             [2,3,count=2]          /         \               /            \   [0,0,count=1] [1,1,count=0] [2,2,count=1], [3,3,count=1]

query(1, 1), return 0

query(1, 2), return 1

query(2, 3), return 2

query(0, 2), return 2

题目思路:

这题和#202一样,只不过max改成了count,就是一个recursion的思路。

Mycode(AC = 859ms):

/** * Definition of SegmentTreeNode: * class SegmentTreeNode { * public: *     int start, end, count; *     SegmentTreeNode *left, *right; *     SegmentTreeNode(int start, int end, int count) { *         this->start = start; *         this->end = end; *         this->count = count; *         this->left = this->right = NULL; *     } * } */class Solution {public:    /**     *@param root, start, end: The root of segment tree and      *                         an segment / interval     *@return: The count number in the interval [start, end]      */    int query(SegmentTreeNode *root, int start, int end) {        // write your code here        if (root == NULL || start > end) {            return 0;        }        else if (root->start == start && root->end == end) {            return root->count;        }        else {            int left_count = query(root->left,                                   max(start, root->start),                                   min(end, (root->start + root->end) / 2));            int right_count = query(root->right,                                   max(start, (root->start + root->end) / 2 + 1),                                   min(end, root->end));            return left_count + right_count;        }    }};


0 0