Lintcode---線段樹查詢(區間最大值)


對於一個有n個數的整數數組,在對應的線段樹中, 根節點所代表的區間為0-n-1, 每個節點有一個額外的屬性max,值為該節點所代表的數組區間start到end內的最大值。

為SegmentTree設計一個 query 的方法,接受3個參數root, startend,線段樹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));
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM