【前缀和】1588. 所有奇数长度子数组的和

简介: 【前缀和】1588. 所有奇数长度子数组的和

📍前言

🕺作者: 迷茫的启明星


学习路线

C语言从0到1

C++初阶

数据结构从0到1

😘欢迎关注:👍点赞🙌收藏✍️留言


🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!


持续更新中~


【前缀和】1588. 所有奇数长度子数组的和

问题描述

给定一个正整数数组 arr,要求计算所有可能的奇数长度子数组的和。子数组定义为原数组中的一个连续子序列。请你返回 arr 中所有奇数长度子数组的和。

知识点

1.前缀和:前缀和是一种预处理方法,用于快速计算数组中任意一段子区间的和。其核心思想是利用之前计算过的和来避免重复计算。


2.动态规划:动态规划是一种通过组合子问题的解来解决原问题的方法。在本题中,我们可以将子数组的和问题分解为更小的子问题,然后组合子问题的解得到原问题的解。

解题思路

我们可以通过前缀和算法求解本题。具体思路如下:


3.计算前缀和数组 nums,其中 nums[i] 表示 arr[0] 到 arr[i-1] 的和。


4.遍历 arr 数组,对于每个元素 arr[j],计算其所有奇数长度子数组的和。


5.对于每个 arr[j],我们可以找到其左边界 j 和右边界 j+k(其中 k 为奇数),从而得到子数组 arr[j] 到 arr[j+k] 的和。由于我们已经计算了前缀和,可以通过 nums[j+k] - nums[j] 快速得到子数组的和。


6.将所有奇数长度子数组的和累加到 sum 变量中,最后返回 sum。


代码实现

以下是使用前缀和算法求解本题的 C++ 代码实现:


class Solution {
public:
    int sumOddLengthSubarrays(vector<int>& arr) {
        int n = arr.size();
        vector<int> nums(n+1, 0);
        int i, j;
        for (i = 1; i < n + 1; ++i) {
            nums[i] = nums[i - 1] + arr[i - 1];
        }
        int sum = 0;
        for (j = 0; j < n; ++j) {
            for (int k = 1; j + k <= n; k += 2) {
                sum += nums[j + k] - nums[j];
            }
        }
        return sum;
    }
};



总结

通过使用前缀和算法,我们可以高效地求解给定数组中所有奇数长度子数组的和。这种算法具有较高的时间效率,适用于求解大规模问题。



相关文章
|
7月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
126 0
|
7月前
|
Java C++ Python
leetcode-209:长度最小的子数组
leetcode-209:长度最小的子数组
46 0
|
7月前
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
72 1
|
4月前
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
|
6月前
|
C++
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
|
5月前
|
C++
2461. 长度为 K 子数组中的最大和(c++)
2461. 长度为 K 子数组中的最大和(c++)
|
7月前
1493.删掉一个元素以后全为1的最长子数组
1493.删掉一个元素以后全为1的最长子数组
33 0
|
7月前
|
算法 测试技术 C#
二分查找|滑动窗口|前缀和|LeetCode209: 长度最小的子数组
二分查找|滑动窗口|前缀和|LeetCode209: 长度最小的子数组
|
存储 算法 Linux
【前缀和】974. 和可被 K 整除的子数组
同样的,本题利用了前缀和的定理.当(pre[i]-pre[j-1])mod k==0时.即为所寻找的答案.
59 0
|
存储 算法 Linux
【前缀和】560.和为 K 的子数组
暴力解法:我们很容易想到通过两个for循环去遍历数组中所有和的可能,之后来判断有几个满足K.他的代码十分的简单,所以这里直接给出.
59 0