提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1480. 一维数组的动态和
题目链接
思路
前缀和:当前数等于前面所有的元素相加和
代码
- ts
function runningSum(nums: number[]): number[] {
for (let i = 1; i < nums.length; i++) {
nums[i] = nums[i] + nums[i - 1]
}
return nums
};
1588. 所有奇数长度子数组的和
题目链接
思路
- 定义sum用于记前缀和
- 枚举一个长度i,枚举一个结束为止j,利用差分得到sum[j-i+1,j]
- 统计加和所有i为奇数的元素
代码
-ts
function sumOddLengthSubarrays(arr: number[]): number {
const n = arr.length;
const prefixSums = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) {
prefixSums[i + 1] = prefixSums[i] + arr[i];
}
let sum = 0;
for (let start = 0; start < n; start++) {
for (let length = 1; start + length <= n; length += 2) {
const end = start + length - 1;
sum += prefixSums[end + 1] - prefixSums[start];
}
}
return sum;
};
1442. 形成两个异或相等数组的三元组数目
题目链接
思路
- 计算前缀和
- 枚举一个j,再枚举i将异或和[i,j-1]放入哈希表
- 再枚举k,去哈希表中查找[j,k]的异或并且和累加
代码
- ts
function countTriplets(arr: number[]): number {
let map = {}
let i, j, k, pre, ans = 0;
for (i = 1; i < arr.length; i++) {
arr[i] = arr[i - 1] ^ arr[i]
}
for (j = 1; j < arr.length; j++) {
map ={}
for (i = 0; i < j; ++i) {
if (i == 0) {
pre = 0
} else {
pre = arr[i - 1]
}
if (map[arr[j - 1] ^ pre]) {
++map[arr[j - 1] ^ pre]
} else {
map[arr[j - 1] ^ pre] = 1
}
}
for (k = j; k < arr.length; k++) {
ans += map[arr[k] ^ arr[j - 1]]||0
}
}
return ans
};
1094. 拼车
题目链接
思路
- 用一个数组来标记上下车情况
- 一次线性扫描标记
- 累加标记,如果某个时间点人数超过了给定值返回false
代码
function carPooling(trips: number[][], capacity: number): boolean {
let numPassengers = new Array(1002).fill(0)
for (let i = 0; i < trips.length; i++) {
const cnt = trips[i][0];
let l = trips[i][1]
let r = trips[i][2]
numPassengers[l] += cnt
numPassengers[r] -= cnt
}
let sum = 0
for (let i = 0; i <= 1000; i++) {
sum += numPassengers[i]
if (sum > capacity) return false
}
return true
};