1588-所有奇数长度子数组的和
题目
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。
子数组 定义为原数组中的一个连续子序列。
请你返回 arr 中 所有奇数长度子数组的和 。
示例 1:
输入:arr = [1,4,2,5,3]
输出:58
解释:所有奇数长度子数组和它们的和为:
[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
我们将所有值求和得到 1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58
示例 2:
输入:arr = [1,2]
输出:3
解释:总共只有 2 个长度为奇数的子数组,[1] 和 [2]。它们的和为 3 。
示例 3:
输入:arr = [10,11,12]
输出:66
提示:
1 <= arr.length <= 100
1 <= arr[i] <= 1000
思路
暴力
统计次数,运用乘法
对于
arr[i]
,在包含arr[i]
的前提下,其左侧有i+1个数字,右侧有arr.size()-i个数字。如果左边分别取0、2、4、8……等偶数个临近数字作为一组,右边则也应该取偶数长度的数字作为一组,这样合并后正好是奇数个长度。因此
arr[i]
在这种条件下会加(i+1+1)/2*(arr.size()-i+1)/2
次。这个公式可以通过带入几个数字找到规律。如果左边分别取1、3、5、7……等奇数个临近数字作为一组,右边也应该取奇数长度的数字作为一组,这样合并吼正好是奇数个长度。因此
arr[i]
在这种条件下会加(i+1)/2*(arr.size()-i)/2
次。这个公式可以通过带入几个数字找到规律。解释下
(i+1+1)/2*(arr.size()-i+1)/2
:- 对于
i
为奇数的情况:左边可以有0、2、4……i+1总共(i+2)/2
个情况。 - 对于
i
为偶数的情况:左边可以有0、2、4……i个总共i/2+1
个。
以上可以统一为
(i+2)/2
。奇数同理。
- 对于
代码
1 | class Solution { |
1588-所有奇数长度子数组的和