LeetCode 1588 所有奇数长度子数组的和[暴力 前缀和] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1588 所有奇数长度子数组的和[暴力 前缀和] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
第一种方法是暴力三重for循环的方法,由于数据集的范围较小,故不用担心超时的情况,第一重for循环是奇数的个数,从1,3,5一直到不大于n,第二重就是几乎整个数组(一直到n - i + 1),目的是遍历每个子数组的头,第三重就是从每个头开始遍历i次进行统计,代码如下:
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int n = arr.size();
int sum = 0;
for(int i = 1; i <= n; i += 2) {
for(int j = 0; j < n - i + 1; j ++) {
for(int k = 0; k < i; k ++) {
sum += arr[j + k];
}
}
}
return sum;
}
};
既然是连续的和,不如提前构造好前缀和,这样就把时间复杂度降为O(n 2 ),代码如下:
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int n = arr.size();
vector<int> prefix(n + 1);
prefix[0] = 0;
// 构造前缀和
for(int i = 1; i <= n; i ++) {
prefix[i] = arr[i - 1] + prefix[i - 1];
}
int sum = 0;
for(int i = 1; i <= n; i += 2) {
for(int j = 0; j < n - i + 1; j ++) {
// 使用前缀和
sum += prefix[j + i] - prefix[j];
}
}
return sum;
}
};
以上是关于LeetCode 1588 所有奇数长度子数组的和[暴力 前缀和] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1480. 一维数组的动态和 / 1588. 所有奇数长度子数组的和 / 528. 按权重随机选择(随机化)