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. 按权重随机选择(随机化)

算法1588. 所有奇数长度子数组的和(多语言实现)

算法1588. 所有奇数长度子数组的和(多语言实现)

文巾解题1588. 所有奇数长度子数组的和

[E前缀和] lc1588. 所有奇数长度子数组的和(前缀和+数学)

[E前缀和] lc1588. 所有奇数长度子数组的和(前缀和+数学)