字首和主要適用的場景是原始陣列不會被修改的情況下,頻繁查詢某個區間的累加和。
字首和,核心**就是下面這段:
class
prefixsum
}/* 查詢閉區間 [i, j] 的累加和 */
public
intquery
(int i,
int j)
}
prefix[i]
就代表著nums[0..i-1]
所有元素的累加和,如果我們想求區間nums[i..j]
的累加和,只要計算prefix[j+1] - prefix[i]
即可,而不需要遍歷整個區間求和。
「差分陣列」的思想和字首和非常類似,差分陣列的主要適用場景是頻繁對原始陣列的某個區間的元素進行增減。
【力扣-560. 和為k的子陣列】
這道題首先想到用滑動視窗來做,但是做了三十分鐘,打了三次補丁,通過三次test case,最終還是不行。
為什麼這題不可以用雙指標/滑動視窗:因為nums[i]可以小於0,也就是說右指標i向後移1位不能保證區間會增大,左指標j向後移1位也不能保證區間和會減小。給定j,i的位置沒有二段性,vice versa。
/**
* 字首和的改進,利用雜湊表,時間複雜度o(n)
*/class
solution
int ans =0;
for(
int i=
0; i
1; i++
) map.
put(presum[i]
, map.
getordefault
(presum[i],0
)+1)
;}return ans;
}}
【力扣-1109. 航班預訂統計】
// 暴力解法,o(n^2),效率不高;
// 這題是經典差分題;
// 有毒,這道題被注釋掉的**是我寫的,然後報錯「global name 'num_flights' is not defined」
// 下面的**是題解裡的,結果也報錯「global name 'num_flights' is not defined」
class
solution
}for
(int x=
1; x
)return diff;
// int counters = new int[n];
// for (int booking : bookings)
// }
// for (int i = 1; i < n; ++i)
// return counters;
}}
刷題筆記6 字首和 差分陣列
字首和的應用場景是,需要對某個區間 i j 頻繁查詢累計和,避免每次查詢都遍歷這個區間。差分陣列的應用場景是,需要對某個區間 i j 頻繁地加或減某一值,避免每次都遍歷這個區間。1.概念 一維字首和 vector nums vector sums nums.size 1,0 空間比nums大1,字首...
差分陣列與字首和
字首和 字首和顧名思義就是前面i個數的總和。假設有乙個序列a,字首和為s。根據概念很容易知到公式 s i displaystyle sum ia j 如何求區間 l,r 的和呢?sum l,r s r s l 1 那如果要對多個不同區間 l,r 進行加減操作呢?然後輸出某個區間 l,r 的區間和,接...
差分 字首和 菜題 刷
貼碼碼,刷題題 include using namespace std define in read int in const int n 1e5 5 int n,a n int main include using namespace std define in read int in const...