對於一個有n個數的整數數組,在對應的線段樹中, 根節點所代表的區間為0-n-1, 每個節點有一個額外的屬性max,值為該節點所代表的數組區間start到end內的最大值。
為SegmentTree設計一個 query 的方法,接受3個參數root, start和end,線段樹root所代表的數組中子區間[start, end]內的最大值。
注意事項
在做此題之前,請先完成 線段樹構造 這道題目。
樣例
對於數組 [1, 4, 2, 3], 對應的線段樹為:
[0, 3, max=4]
/ \
[0,1,max=4] [2,3,max=3]
/ \ / \
[0,0,max=1] [1,1,max=4] [2,2,max=2], [3,3,max=3]
query(root, 1, 1), return 4
query(root, 1, 2), return 4
query(root, 2, 3), return 3
query(root, 0, 2), return 4
思路:當遇到一些關於對連續點的修改和統計的問題時,可以考慮用線段樹來解決。
這屬於典型的RMQ問題(區間最值查詢問題),所以最好通過構建線段樹,利用線段樹的性質來求解,這樣將問題轉化成線段樹,會讓復雜度降低到log(n);
還是要用遞歸的思路解決。先寫出基准情形,然后遞歸解決。思路和上一篇博客求解給定區間元素個數一模一樣。
都是借助於線段樹本身的性質,減小算法的時間復雜度。
/**
* Definition of SegmentTreeNode:
* class SegmentTreeNode {
* public:
* int start, end, max;
* SegmentTreeNode *left, *right;
* SegmentTreeNode(int start, int end, int max) {
* this->start = start;
* this->end = end;
* this->max = max;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
*@param root, start, end: The root of segment tree and
* an segment / interval
*@return: The maximum number in the interval [start, end]
*/
/*
思路:當遇到一些關於對連續點的修改和統計的問題時,可以考慮用線段樹來解決。
這屬於典型的RMQ問題(區間最值查詢問題),所以最好通過構建線段樹,利用線段樹的性質來求解!!
這樣將問題轉化成線段樹,會讓復雜度降低到log(n);
還是要用遞歸的思路解決。先寫出基准情形,然后遞歸解決。
*/
int query(SegmentTreeNode *root, int start, int end) {
// write your code here
if(!root||start>end){
return 0;
}
if(root->start>=start&&root->end<=end){
return root->max;
}
int mid=root->start+(root->end-root->start)/2;
if(start>mid){
return query(root->right,start,end);
}
else if(end<mid){
return query(root->left,start,end);
}
else return max(query(root->left,start,mid),query(root->right,mid+1,end));
}
};
