区间最小数-LintCode

来源:互联网 发布:美利达勇士300d淘宝 编辑:程序博客网 时间:2024/06/05 02:45

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

注意事项:
在做此题前,建议先完成以下三道题 线段树的构造, 线段树的查询 及 线段树的修改。

样例:
对于数组 [1,2,7,8,5], 查询 [(1,2),(0,4),(2,4)],返回 [2,1,5]

挑战 :
每次查询在O(logN)的时间内完成

#ifndef C205_H#define C205_H#include<iostream>#include<vector>using namespace std;class Interval{public:    int start, end;    Interval(int start, int end)    {        this->start = start;        this->end = end;    }};class SegmentTree{public:    int start, end, min;    SegmentTree *left, *right;    SegmentTree(int start, int end, int min)    {        this->start = start, this->end = end, this->min = min;        this->left = this->right = NULL;    }};class Solution {public:    /*    * @param A: An integer array    * @param queries: An query list    * @return: The result list    */    vector<int> intervalMinNumber(vector<int> &A, vector<Interval> &queries) {        // write your code here        vector<int> v;        if (A.empty() || queries.empty())            return v;        SegmentTree *root = build(A, 0, A.size() - 1);        modify(root);        for (auto c : queries)        {            v.push_back(query(root,c.start, c.end));        }        return v;    }    SegmentTree * build(vector<int> &A,int start, int end) {        if (start > end)            return NULL;        SegmentTree *node = new SegmentTree(start, end, 0);        if (start == end)        {            node->min = A[start];            return node;        }        node->left = build(A, start, (start + end) / 2);        node->right = build(A, (start + end) / 2 + 1, end);        return node;    }    void modify(SegmentTree * root) {        if (!root->left || !root->right)            return;        modify(root->left);        modify(root->right);        root->min = minVal(root->left->min, root->right->min);    }    int query(SegmentTree * root, int start, int end) {        if (start > end || start<root->start || end>root->end)            return 0;        SegmentTree *node = root;        if (start == node->start&&end == node->end)            return node->min;        if (end <= node->left->end)            return query(node->left, start, end);        else if (start >= node->right->start)            return query(node->right, start, end);        else        {            return minVal(query(node->left, start, node->left->end), query(node->right, node->right->start, end));        }    }    int minVal(int a, int b)    {        return a < b ? a : b;    }};#endif
原创粉丝点击