做网站的算什么行业,青岛做网站哪个公司好,长春网易网站建设,石家庄网络公司排名目录
307. 区域和检索 - 数组可修改
题目描述#xff1a;
实现代码与解析#xff1a;
树状数组#xff1a;
原理思路#xff1a; 307. 区域和检索 - 数组可修改
题目描述#xff1a; 给你一个数组 nums #xff0c;请你完成两类查询。
其中一类查询要求 更新 数组…目录
307. 区域和检索 - 数组可修改
题目描述
实现代码与解析
树状数组
原理思路 307. 区域和检索 - 数组可修改
题目描述 给你一个数组 nums 请你完成两类查询。
其中一类查询要求 更新 数组 nums 下标对应的值另一类查询要求返回数组 nums 中索引 left 和索引 right 之间 包含 的nums元素的 和 其中 left right
实现 NumArray 类
NumArray(int[] nums) 用整数数组 nums 初始化对象void update(int index, int val) 将 nums[index] 的值 更新 为 valint sumRange(int left, int right) 返回数组 nums 中索引 left 和索引 right 之间 包含 的nums元素的 和 即nums[left] nums[left 1], ..., nums[right]
示例 1
输入
[NumArray, sumRange, update, sumRange]
[[[1, 3, 5]], [0, 2], [1, 2], [0, 2]]
输出
[null, 9, null, 8]解释
NumArray numArray new NumArray([1, 3, 5]);
numArray.sumRange(0, 2); // 返回 1 3 5 9
numArray.update(1, 2); // nums [1,2,5]
numArray.sumRange(0, 2); // 返回 1 2 5 8提示
1 nums.length 3 * 104-100 nums[i] 1000 index nums.length-100 val 1000 left right nums.length调用 update 和 sumRange 方法次数不大于 3 * 104
实现代码与解析
树状数组
class NumArray {
public:vectorint tr vectorint(1000010);int lowbit(int x) {return x -x;}int query(int x) {int res 0;for (int i x; i 0; i - lowbit(i)) res tr[i];return res;}void add(int x, int u) {for (int i x; i n; i lowbit(i)) tr[i] u;}vectorint nums;int n;NumArray(vectorint nums) {n nums.size();this-nums nums;// 初始化 树状数组tr.resize(n 1, 0);for (int i 0; i n; i) add(i 1, nums[i]);}void update(int index, int val) {add(index 1, val - nums[index]);nums[index] val;}int sumRange(int left, int right) {return query(right 1) - query(left);}
};
原理思路 如果没有更新用前缀和就行但是此题数组会改变如果每次都求一次前缀和一定超时所以考虑用树状数组。 树状数组代码十分好写和简单背下来就可以其具体原理可以自行查阅理解起来还是挺难的。