!!!---1588|Sum of All Odd Length Subarrays(新)

1588. 所有奇数长度子数组的和

Given an array of positive integers arr(正整数), calculate(计算) the sum of all possible odd-length subarrays.(奇数长度子数组的和)

A subarray(n. 子阵列;子数组) is a contiguous(连续的) subsequence(n. 随后;接着(尤指结果、效果);(数学)子序列,部分序列) of the array.

Return the sum of all odd-length subarrays of arr.(返回arr的所有奇数长度子数组的和。)

Example 1:
Input: arr = [1,4,2,5,3]
Output: 58
Explanation: The odd-length subarrays of arr and their sums are:
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
If we add all these together we get 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

Example 2:
Input: arr = [1,2]
Output: 3
Explanation: There are only 2 subarrays of odd length, [1] and [2]. Their sum is 3.

Example 3:
Input: arr = [10,11,12]
Output: 66

Constraints:
1 <= arr.length <= 100
1 <= arr[i] <= 1000

第一方法:计算每个元素会出现的次数然后合起来*这个数的值累积=总值

(从leedcode的题解看到的一种方法)

class Solution {
    public int sumOddLengthSubarrays(int[] arr) {
          int res = 0;
          int arrSize=arr.length;
    int lEven,lOdd,rEven,rOdd;
//1 2 3 4 5
//lodd=(0+1)/2=0
//levrn=1;
//rodd=5/2=2;
//reve=(5-0+1)/2=3
//res+=0*2+1*3=3*1=3
/*
根据题意逐步计算子数组的和,发现每个数字都多次出现,多次计算,故思考能否直接计算每个数字的出现次数,思路如下:
1.任取数组下标为i(第i+1个)的元素
2.其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,i/2+1种为偶数
3.右边可以取0~(n-i-1)个元素,共n-i种方案,其中(n-i)/2种为奇数,(n-i+1)/2种为偶数
4.合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,左偶->右偶
5.所以arr[i]的出现次数为lOdd X rOdd + lEven X rEven,即左奇X右奇 + 左偶X右偶
注:不会出现所谓的重复统计,因为每次都计算不同数字的出现次数
*/
    for(int i=0;i<arrSize;i++){
        lOdd = (i+1)/2;
        lEven = i/2 + 1;
        rOdd = (arrSize-i)/2;
        rEven = (arrSize-i+1)/2;
        res += (lOdd*rOdd + lEven*rEven) * arr[i];
    }
    return res;
    }
}
推出的过程:
数组:1 2 3 4 5 6 7
下标:0 1 2 3 4 5 6
0号位置:{1}{1,2,3},{1,2,3,4,5},{1,2,3,4,5,6,7}
1号位置:{2},{2,3,4},{2,3,4,5,6}
2号位置:{3}{3,4,5},{3,4,5,6,7}
3号位置:{4}{4,5,6}
4号位置:{5},{5,6,7}
5号位置:{6}
6号位置:{7}=次数*值
数组值为1的和:(1+1+1+1*1=4
数组值为2的和:(1+1+1+1+1+1*2=12
数组值为3的和:8*3=16
数组值为4的和: 8*4=24
数组值为5的和:8*5=40
数组值为6的和:6*6=36
数组值为7的和:4*7=28
4+12+16+24+40+36+28=答案
这是计算的过程,然后我们关键是怎么判断每个元素出现的次数?
看看题目,题目是要计算奇数长度子数组的和 ,奇数长度!
举个例子看看,上面数组的下标为3的元素(值=4,4出现的情况{1,2,3,4,5},{1,2,3,4,5,6,7}{2,3,4},{2,3,4,5,6}
{3,4,5},{3,4,5,6,7}{4}{4,5,6}这八种里面出现4

{1,2,3,4,5},      左边3个数+4+右边1个数
{1,2,3,4,5,6,7}   左边3个数+4+右边3个数
{2,3,4}           左边2个数+4+右边0个数
{2,3,4,5,6}       左边2个数+4+右边2个数
{3,4,5}            左边1个数+4+右边1个数
{3,4,5,6,7}         左边1个数+4+右边3个数
{4}                左边0个数+4+右边0个数  
{4,5,6}              左边0个数+4+右边2个数 
所以通过一个数的8种情况:
合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,
左偶->右偶。
其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,
i/2+1种为偶数

上面下标为3(值=4)的共3+1=4种方案
4左边个数为奇数:1,2,3,4或者3,4两种情况,(i+1)/2
4左边个数为偶数:2,3,4或者4两种情况        i/2+1

4右边个数为奇数:4,5或者4,5,6,7两种    (n-i)/2
4右边个数为偶数:4或者4,5,6两种         (n-i+1)/2

然后要得到每个元素左边的个数和每个元素右边的个数
1.任取数组下标为i(第i+1)的元素
2.其左边可以取0~i个元素,共i+1种方案,其中(i+1)/2种为奇数,i/2+1种为偶数
3.右边可以取0~(n-i-1)个元素,共n-i种方案,其中(n-i)/2种为奇数,(n-i+1)/2种为偶数
4.合成子数组须满足条件:左边+本身+右边 = 奇数个,故左奇->右奇,左偶->右偶
5.所以arr[i]的出现次数为lOdd X rOdd + lEven X rEven,即左奇X右奇 + 左偶X右偶
注:不会出现所谓的重复统计,因为每次都计算不同数字的出现次数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值