快轉到主要內容
  1. Algorithms/

Prefix Sum

·1 分鐘· ·
Algorithm Prefix Sum
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

介紹
#

Prefix Sum(前綴和) 是一種常見的演算法技巧,用來快速計算子陣列的總和或區間值。

舉例來說,假設有一個陣列 nums = [2, 4, 5, 7],如果我們想要查詢從 nums[i]nums[j] 的總和,使用暴力解法每次查詢都需要花費 O(n) 的時間。

然而,只要先遍歷一次陣列並建立一個 prefix sum 陣列,就能將每次查詢的時間縮短為 O(1)

核心想法
#

這個技巧的核心概念是:建立一個陣列,讓其中的每個元素都代表原陣列中所有前面元素的累加和。

因此,對於索引 i,在 prefix[i + 1] 中儲存的值就是原始陣列從索引 0i 的總和。

prefix = [0] * (len(nums) + 1)
for i in range(len(nums)):
    prefix[i + 1] = prefix[i] + nums[i]

如果我們要查詢從索引 ij 的區間總和,只需要這樣寫:

sum_ = prefix[j+1] - prefix[i]

prefix 陣列的第一個元素代表的是「空區間」(也就是總和為 0 的情況),所以我們用 prefix[j + 1] 來包含索引 j 的值,並用 prefix[i] 來排除索引 i 之前的總和。

模板
#

prefix = [0] * (len(nums) + 1)
for i in range(len(nums)):
    prefix[i + 1] = prefix[i] + nums[i]

sum_ = prefix[j+1] - prefix[i]

主要參數說明:
#

範例
#

經典題

class NumArray:

    def __init__(self, nums: List[int]):
        self.ps = [0]
        for num in nums:
            self.ps.append(num+self.ps[-1])

    def sumRange(self, left: int, right: int) -> int:
        return self.ps[right+1] - self.ps[left]

LeetCode
#

相關文章

Next Permutation
·1 分鐘
Algorithm Next Permutation
Next Permutation 介紹
Digit Dynamic Programming
·2 分鐘
Algorithm Digit DP
Digit Dynamic Programming 介紹
LeetCode 303: Range Sum Query - Immutable
·1 分鐘
LeetCode Blog Easy Prefix Sum
LeetCode 解題紀錄
LeetCode 724: Find Pivot Index
·1 分鐘
LeetCode Blog Daily Easy Prefix Sum
LeetCode 解題紀錄
LeetCode 1534: Count Good Triplets
·2 分鐘
LeetCode Blog Daily Easy Prefix Sum
LeetCode 解題紀錄
LeetCode 560: Subarray Sum Equals K
·1 分鐘
LeetCode Blog Daily Medium
LeetCode 解題紀錄