303. 区域和检索 - 数组不可变
303. 区域和检索 - 数组不可变
给定一个整数数组 nums
,求出数组从索引 i
到 j
(i ≤ j
)范围内元素的总和,包含 i
、j
两点。
实现 NumArray
类:
NumArray(int[] nums)
使用数组nums
初始化对象int sumRange(int i, int j)
返回数组nums
从索引i
到j
(i ≤ j
)范围内元素的总和,包含i
、j
两点(也就是sum(nums[i], nums[i + 1], ... , nums[j])
)
示例:
1 | 输入: |
前缀和概念的首次应用,在求连续元素的和的情况下尤其好用
Solution
题目要求是返回一个数组间从下标i
到下标j
元素之间的和,如果采用暴力算法,循环计算,由于每次检索的时间和检索的下标范围有关,因此时间复杂度较高
所以能实现计算出前缀和,那么可以将时间复杂度降低到O(1)
具体实现方面,假设数组 nums
的长度为 n
,创建长度为 n+1
的前缀和数组sums
,对于0≤i<n
都有sums[i+1]=sums[i]+nums[i]
,sums[i]
表示数组nums
从下标0
到下标i-1
的前缀和
前缀和计算方法:sumRrage(i,j)=sums[j+1]-nums[i]
1 | class NumArray { |