📍前言
🕺作者: 迷茫的启明星
学习路线
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; } };
总结
通过使用前缀和算法,我们可以高效地求解给定数组中所有奇数长度子数组的和。这种算法具有较高的时间效率,适用于求解大规模问题。