307. Range Sum Query
来源:互联网 发布:长沙网络推广 编辑:程序博客网 时间:2024/06/06 12:19
原题:
Given an integer array nums, find the sum of the elements between indicesi and j (i ≤ j), inclusive.
The update(i, val) function modifies nums by updating the element at indexi to val.Example:
Given nums = [1, 3, 5]sumRange(0, 2) -> 9update(1, 2)sumRange(0, 2) -> 8
Note:
- The array is only modifiable by the update function.
- You may assume the number of calls to update and sumRange function is distributed evenly.
主要实现功能是给数组下标范围,返回它的该范围内元素的和。
解题思路:硬解O(n)是TLE的。这里用到一个新的数据结构叫树状数组。它是一个修改元素和查询元素复杂度都是O(logn)的数组。它的原理不好理解,我也没弄清。它主要有三个方法,我暂时会用:
public int sumRange(int i, int j) { return sum(j + 1) - sum(i); } int lowbit(int pos){ return pos&(-pos); } void add(int pos, int value){//修改元素值 while(pos < c.length){ c[pos] += value; pos += lowbit(pos); } } int sum(int pos){//返回前i个元素和 int res = 0; while(pos > 0){ res += c[pos]; pos -= lowbit(pos); } return res; }
树状数组一般都是辅助用的数组,用于把你需要操作的数组以另一种形式存起来。
结果代码:
int[]c; int[]nums; public NumArray(int[] nums) { this.nums = nums; int len = nums.length; c = new int[len + 1]; for (int i = 0;i < len;i++){ add(i + 1,nums[i]); } } public void update(int i, int val) { int dif = val - nums[i]; nums[i] = val; add(i + 1,dif); } public int sumRange(int i, int j) { return sum(j + 1) - sum(i); } int lowbit(int pos){ return pos&(-pos); } void add(int pos, int value){//修改元素值 while(pos < c.length){ c[pos] += value; pos += lowbit(pos); } } int sum(int pos){//返回前i个元素和 int res = 0; while(pos > 0){ res += c[pos]; pos -= lowbit(pos); } return res; }
阅读全文
0 0
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable**
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable
- 307. Range Sum Query - Mutable.
- js和java中数组的区别和定义方式
- SourceTree跳过Atlassian账号添加
- Windows系统环境变量、JAVA环境变量配置以及JVM加载过程
- c# md5加密算法实例
- retrofit2.adapter.rxjava.HttpException: HTTP 500 Internal Server Error
- 307. Range Sum Query
- PHP之图片上传
- 重建二叉树
- CSS样式初始化代码
- mstsc 远程命令
- C/C++之回调函数
- 普通员工与优秀员工的区别
- Spring 事务管理
- Mac电脑使用:通过Mac电脑导出iPhone手机里面的视频(不是iTunes导出视频的方法)