前綴和(preSum)算法


一維數組求區間和

 

preSum 方法能快速計算指定區間段 【i,j】的元素之和。它的計算方法是從左向右遍歷數組,當遍歷到數組的i位置時,preSum 表示 i 位置左邊的元素之和。

 

 

 推導過程引用自:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/jian-dan-wen-ti-xi-zhi-fen-xi-qian-tan-q-t2nz/

 

 

算法思路:

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];
    }
};

參考:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/presum-qian-zhui-he-xiang-xi-jiang-jie-b-nh23/

 

二維矩陣版:

 

同樣的思路,不同的是

1.presum數組的推導方式,利用:

  preSum[i+1][j+1preSum[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]

同樣利用了  加一  的方法避免對特殊情況進行處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM