树状数组learning Day1识海社区打卡1st

鉴于上次省赛的惨烈失败教训,狠狠加训,距离下次沈阳站还有两星期,再次感谢东北大学赐予的外卡机会,你知道的,东北大学一直是我的第二户籍所在地。今天到下星期周末为止估计都会持续更新树状数组和线段树相关的笔记。

我的刷题顺序大概会按照[灵神提单](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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2024-11-09 22:26  夏尾草  阅读(30)  评论(0)    收藏  举报