:::success
- 2171. 拿出最少数目的魔法豆 :::
经典参考:
秒杀七道题
吴师兄-LeetCode 例题精讲 | 18 前缀和:空间换时间的技巧
前缀和 & 差分
前缀和&&差分-知乎
TODO:
- 724. 寻找数组的中心下标
- 560. 和为K的子数组
- 370. 区间加法
- 303. 区域和检索 - 数组不可变
- 1248. 统计「优美子数组」
- 974. 和可被 K 整除的子数组
- 523. 连续的子数组和
- 930. 和相同的二元子数组
- 560. 和为 K 的子数组
- 930. 和相同的二元子数组
- 974. 和可被 K 整除的子数组
- 1371. 每个元音包含偶数次的最长子字符串
- 1542. 找出最长的超赞子字符串
- 1590. 使数组和能被 P 整除
什么是前缀和?
应用:
1310. 子数组异或查询
前缀异或pre[i + 1] = pre[i] + nums[i]
case 1: arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]] => [2,7,14,8]
xors [ 0, 1, 2, 6, 14 ]
case 2: [15,8,8,8,15] [[2,2],[3,3]] [8,8]
var xorQueries = function(arr, queries) {
let n = arr.length;
let pre = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) {
pre[i + 1] = pre[i] ^ arr[i];
}
let res = [];
for (let query of queries) {
let [start, end] = query;
res.push(pre[start] ^ pre[end + 1]);
}
return res;
};
1915. 最美子字符串的数目
状态压缩+前缀和
var wonderfulSubstrings = function(word) {
let n = 1 << 10;
let counts = new Array(n).fill(0);
counts[0] = 1;
let pre = 0;
let ans = 0;
for (let c of word) {
let cur = c.charCodeAt(0) - 'a'.charCodeAt(0);
pre ^= (1 << cur);
ans += counts[pre];
for (let i = 1; i < n; i <<= 1) {
ans += counts[pre ^ i];
}
++counts[pre];
}
return ans;
};
参考