一、题目
1.题目描述
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。
子数组 定义为原数组中的一个连续子序列。
请你返回 arr 中 所有奇数长度子数组的和 。
2. 题目链接
二、解题报告
1.思路分析
- 子数组的和就是找数组中[l,r]范围的和,只要确定l,r的长度为奇数即可。
- 对于区间求和问题,可以通过前缀和优化
2. 代码实现
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int n = arr.length;
int[] sum = new int[n+1];
int res = 0;
//前缀和
for(int i = 1; i <= n; i++){
sum[i] = sum[i-1] + arr[i-1];
}
//len是子数组的长度
for(int len = 1; len <= n; i +=2){
//l是子数组的左端点,右端点为r:l+len-1
for(int l = 0; l+len-1 < n; l++){
int r = len+l-1;
//区间[l,r]的和
res += sum[r+1] - sum[l];
}
}
return res;
}
}