前言
就从数组开始,以后会一直更新算法。数组有下图这些知识点与技巧。本文主要讲解其中的前缀和知识点。
思路
适合的场景:原始数组不会被修改,且频繁查询某个区间的累加和。 创建一个prefixSum数组,长度比原数组nums长度多1。prefixSum[i]存储nums[0]到nums[i]的和。 尤其要注意prefixSum与nums的坐标换算,如下图所示。
区域和检索 - 数组不可变(一维前缀和)
解题思路
常规思路是通过遍历i到j。但这样时间复杂度就是O(n)。
采用前缀和。sumRange = prefixSum[right + 1] - prefixSum[left]
。
注意原数组与前缀和数组的下标换算,例如nums[i]的前缀和是preSum[i + 1]。如下图所示。
复杂度分析
时间复杂度:初始化O(n),每次检索O(1),n是数组长度。 空间复杂度:O(n)。 代码
class NumArray {
private int[] prefixSum;
public NumArray(int[] nums) {
prefixSum = new int[nums.length + 1];
fo