1. 程式人生 > 實用技巧 >leetcode-----102. 二叉樹的層序遍歷

leetcode-----102. 二叉樹的層序遍歷

st表是一個求RMQ問題的一種比線段樹查詢時間複雜度要小的演算法

st表的主體是一個二維陣列st[i][j],表示需要查詢的陣列的從下標i到下標i+2^j - 1的最值,這裡以最大值為例

首先應該預處理log函式 因為向下取整所以可以這麼來做:

int mlog[N];

void pre(int n){
    mlog[1]=0;
    mlog[2]=1;
    for(int i=3;i<=n;i++){
        mlog[i]=mlog[i/2]+1;
    }
}

然後就是初始化st表了

const int N=1e3+10;
int st[N][20];

void
init(int& nums[],int n){ for(int i=0;i<n;i++){ st[i][0]=nums[i]; } for(int j=1;(1<<j)<=n;j++){ for(int i=0;i+(1<<j)-1<n;i++){ st[i][j]=max(st[i+(1<<(j-1))][j-1],st[i][j-1]); } } }

最後就是查詢了:

int query(int l,int r)
{
    
int k = (int)(log((double)(r-l+1))-log(2.0)); return max(st[l][k],st[r-(1<<k)+1][k]); //為了防止向下取整出現區間不完整的問題,那麼就直接把l,r分成兩個區間 一個是前半部分包含,一個是後半部分包含 雖然有重疊但是對求最值並沒有影響 }

模板先寫下,以後發現有錯誤或優化再改