一、前缀和
二、刷题
LeetCode 724. 寻找数组的中心下标 原题链接
class Solution {
public:
int pivotIndex(vector<int>& nums) {
vector<int> sum(100010);
for (int i = 0; i < nums.size(); i ++) {
sum[i] = nums[i];
if (i) {
sum[i] = sum[i - 1] + nums[i]; // 计算前缀和
}
}
if (sum[nums.size() - 1] - sum[0] == 0) // 考虑中心在0的情况
return 0;
for (int i = 1; i < nums.size(); i ++) {
if (sum[i - 1] == sum[nums.size() - 1] - sum[i]) // [左边部分的和]与[右边部分的和]
{
return i;
}
}
return -1;
}
};
LeetCode 1480. 一维数组的动态和 原题链接
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
for (int i = 1; i < nums.size(); i ++) {
nums[i] = nums[i];
if (i)
nums[i] += nums[i - 1];
}
return nums;
}
};
LeetCode 1588. 所有奇数长度子数组的和 原题链接
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
vector<int> sum(110);
int pre, ans = 0;
for (int i = 0; i < arr.size(); i ++) {
sum[i] = arr[i];
if (i) sum[i] = sum[i - 1] + arr[i];
}
for (int i = 1; i <= arr.size(); i += 2) { // 奇数的长度
for (int j = i - 1; j < arr.size(); j ++) { // 以j结尾的起始位置并且长度为i的子数组
if (j - i == -1) {
pre = 0;
}else {
pre = sum[j - i];
}
ans += sum[j] - pre;
}
}
return ans;
}
};