文章目录
- Tag
- 题目来源
- 解题思路
- 方法一:自定义前缀和数组
- 方法二:使用 accumulate() 实现前项求和
- 写在最后
Tag
【前缀和】【数组】【2024-03-18】
题目来源
303. 区域和检索 - 数组不可变
解题思路
方法一:自定义前缀和数组
前缀和的基础知识不再强调,简单提一下,包括:前缀和的定义、实现、前缀数组的长度。如果对基础知识还不熟,可以移步参考 一文讲清楚【前缀和】。
本小节重点说下前缀数组 preSum
的长度问题,通常有两种长度。一是等于原数组 nums
的长度,而是等于原数组的长度+1。前缀数组的长度通常设定为第二种。
按照第二种设定的前缀数组有 preSum[0] = 0
,preSum[i]
表示数组 nums
中前 i
个元素之和。之所以设定 preSum
的长度为 nums.size() + 1
,是为了将前缀和与区间和的形式统一,即 nums[l, ..., r]
区间的和为 preSum[r+1] - preSum[l]
。
实现代码
class NumArray {
public:
vector<int> preSum;
NumArray(vector<int>& nums) {
int n = nums.size();
preSum.resize(n+1);
for (int i = 1; i <= n; ++i) {
preSum[i] = preSum[i-1] + nums[i-1];
}
}
int sumRange(int left, int right) {
return preSum[right+1] - preSum[left];
}
};
复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n),
n
n
n 为数组 nums
的长度。
空间复杂度: O ( n ) O(n) O(n)。
方法二:使用 accumulate() 实现前项求和
除了自定义前缀数组记录数组的前项和之外,还可以使用内置函数 accumulate()
实现求解前项和。代码过于简单,展示如下:
实现代码
class NumArray {
public:
vector<int> preSum;
NumArray(vector<int>& nums) {
this->preSum = nums;
}
int sumRange(int left, int right) {
return accumulate(preSum.begin() + left, preSum.begin() + right + 1, 0);
}
};
复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n),
n
n
n 为数组 nums
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。