leetcode-----102. 二叉樹的層序遍歷
阿新 • • 發佈:2020-07-19
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]; voidinit(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分成兩個區間 一個是前半部分包含,一個是後半部分包含 雖然有重疊但是對求最值並沒有影響 }
模板先寫下,以後發現有錯誤或優化再改