一維數組求區間和:
preSum 方法能快速計算指定區間段 【i,j】的元素之和。它的計算方法是從左向右遍歷數組,當遍歷到數組的i位置時,preSum 表示 i 位置左邊的元素之和。
算法思路:
1.設原數組nums大小為N,定義一個大小為N+1的數組preum,preSum[i] 表示該元素左邊所有元素之和(不包含 i 元素)。遍歷原數組,利用 preSum[i + 1] = nums[i] + preSum[i]
每次對nums數組的[0,j)范圍求和,賦值給presum[i]。
2.利用 sum(i, j) = preSum[j + 1] - preSum[i] 快速求區間和。
定義N+1大小的presum數組是因為,可以方便地求區間和,不需要對i=0的特殊情況進行處理。
構造時時間復雜度和空間復雜度都是O(n),查詢O(n)。
class NumArray {
public:
vector<int> presum;
NumArray(vector<int>& nums)
{
int N = size(nums);
presum.resize(N+1);
for(int i = 0;i<N;i++)
{
presum[i+1] = presum[i] +nums[i];
}
}
int sumRange(int i, int j) {
return presum[j+1] - presum[i];
}
};
二維矩陣版:
同樣的思路,不同的是
1.presum數組的推導方式,利用:
preSum[i+1][j+1] = preSum[i][j+1]+preSum[i+1][j]−preSum[i][j]+matrix[i][j]
2.求任意子矩陣的和:
sum([row1,col1]~[row2,col2]) = preSum[row2+1][col2+1]−preSum[row2+1][col1]−preSum[row1][col2+1]+preSum[row1][col1]
同樣利用了 加一 的方法避免對特殊情況進行處理。