题目描述
思路
题目要求我们求解所有奇数长度数组的和。若暴力循环求解,时间复杂度过高。所以,我们可以采用前缀和优化。
如上图输入arr数组,sum[i]用于计算arr数组中前i个数的和。(在程序中,先给sum[0]赋值,等于arr[0],其余sum[i]=sum[i-1]+arr[i])
接着,我们计算需要返回的ret。我们定义两个循环变量i和j。先定i不动,j向后移动,然后每移动一个位置,就判断一下,是否i和j之间相差奇数个数,若是,则ret+=sum[j]-sum[i-1]。(包括i,所以是减去前一个位置的。)
然后i作为外层循环,后续循环如上面一样判断。
代码
class Solution {
public:
int sumOddLengthSubarrays(vector<int>&arr) {
int length=arr.size();//获取数组中元素的个数
int sum[length];//定义前缀和数组
long long int ret;
ret=0;
sum[0]=arr[0];
//计算前缀和
for (int i=1;i<length;i++)
{
sum[i]=sum[i-1]+arr[i];
}
for (int i=0;i<length;i++)
{
for (int j=i;j<length;j++)
{
if ((j-i+1)%2)//若相差奇数个数
{
if (i==0) ret+=sum[j];//i=0时,不分开讨论sum[i-1]数组越界。
else
ret+=sum[j]-sum[i-1];
}
}
}
return ret;
}
};