1588. 所有奇数长度子数组的和
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。
子数组 定义为原数组中的一个连续子序列。
请你返回 arr 中 所有奇数长度子数组的和 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-all-odd-length-subarrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
- 如果我们知道以
a
r
r
[
i
]
arr[i]
arr[i] 结尾的所有奇数/偶数长度子数组的和和个数:
- oddNum
- oddSum
- evenNum
- evenSum
- 则对于
a
r
r
[
i
+
1
]
arr[i+1]
arr[i+1], 则有
- oddNum = last.evenNum + 1
- oddSum = oddNum* arr[i] + last.evenSum
- evenNum = last.oddNum
- evenSum = evenNum* arr[i] + last.oddSum
算法
class Solution {
struct Node{
int oddNum;
int evenNum;
int oddSum;
int evenSum;
Node(int on = 0,int en = 0,int os = 0,int es = 0)
:oddNum(on),evenNum(en),oddSum(os),evenSum(es){
}
};
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int n = arr.size();
Node node1;
int oddSum = 0;
for(int i = 0;i < n;++i){
Node node;
node.oddNum = node1.evenNum +1;
node.evenNum = node1.oddNum;
node.oddSum = node1.evenSum + node.oddNum * arr[i];
node.evenSum = node1.oddSum + node.evenNum * arr[i];
oddSum += node.oddSum;
node1 = node;
}
return oddSum;
}
};
扩展
- 如果求偶数长度的子数组的和,其实也是使用上面的动态规划