樹狀陣列learning Day1識海社群打卡1st

夏尾草發表於2024-11-09

鑑於上次省賽的慘烈失敗教訓,狠狠加訓,距離下次瀋陽站還有兩星期,再次感謝東北大學賜予的外卡機會,你知道的,東北大學一直是我的第二戶籍所在地。今天到下星期週末為止估計都會持續更新樹狀陣列和線段樹相關的筆記。

我的刷題順序大概會按照[靈神提單](LC-Rating & Training) ->codeforces這樣的步驟來,靈神提單十分適合入門一門新的演算法,而且力扣看題解十分方便,強烈推薦入門使用。力扣還有一個好處就是題目不會像別的oj平臺一樣難以理解,不看個好幾分鐘都提煉不出題目意思,當然這個速度是能隨著刷題數量的增多而逐漸摸清楚題目套路而縮短時間的,如果要打演算法類競賽還是得多吃些這種屎,把時間花在平時,賽場上就能獲得更好的表現。

初識樹狀陣列:樹狀陣列是一個簡化版的線段樹,能完成單點查詢/修改,區間查詢/修改,區間修改/單點查詢等操作;

優點:複雜度於線段樹一樣都是logN,但常熟比線段樹小;

缺點:擴充套件性弱,線段樹能解決的問題,樹狀陣列不一定能解決。

3187. 陣列中的峰值 - 力扣(LeetCode)

這道例題非常經典,給定一個陣列,對陣列進行區間查詢和單點修改。思路大概就是先寫一個陣列用於儲存字首陣列的峰值最多值,然後對於單點修改寫一個更新函式,用於更新替換後字首陣列最多的值,寫一個查詢直接查詢區間的峰值。

由於我也初學寫這個就不展示簡陋的程式碼了,建議直接看靈神的。

3187. 陣列中的峰值 - 力扣(LeetCode)值得關注的是靈神在寫字首和函式和更新函式中用到了二進位制的知識,如果字首和一個個查詢實在太慢了所以

 void update(int i, int val) {
        for (; i < f.size(); i += i & -i) {
            f[i] += val;
        }
    }   //直接跳到下一個2的冪次方,比如3跳4,4跳8如此類推
 int pre(int i) {
        int res = 0;
        for (; i > 0; i &= i - 1) {
            res += f[i];
        }
        return res;
    }//也是一種跳躍查詢,可以自己模擬一下



作者:靈茶山艾府
連結:https://leetcode.cn/problems/peaks-in-array/solutions/2812394/shu-zhuang-shu-zu-pythonjavacgo-by-endle-tj0w/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章