题目描述
给你一个正整数数组 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
题解
这题在leetcode上是归在简单类型中,但是我做题时还真卡住了。难点就在于从一个数组中取出来的奇数个元素,如果奇数个小于数组长度(或者长度减1),就会是一个排列组合问题了!比如从四个元素中随机取3个,有几种组合?从7个元素中随机取3个有几种组合?从7个中取5个呢?我苦于无法用js语言表达出排列组合问题,感觉这太难了。。
结果,我最后发现审题出错:子数组定义为原数组中的一个连续子序列。
这个题其实是简化过了,如果没有子数组的定义限制,这题的难度会陡增。但是在限制了子数组定义的情况下,奇数个元素的子数组就很好取出来了。
具体思路就是,用遍历枚举,每遍历一次就依次从原数组丢掉一个元素,再将奇数个子数组逐一加起来就好了,来看具体代码:
/**
* @param {number[]} arr
* @return {number}
*/
var sumOddLengthSubarrays = function(arr) {
let res = 0;
for (let i = 0; i < arr.length; i++) {
let brr = [];
for (let j = i; j < arr.length; j++) {
brr.push(arr[j]);
if (brr.length % 2 === 1) {
res += brr.reduce((a, b) => a + b);
}
}
}
return res;
};
复杂度分析
时间复杂度:O(n^3); 空间复杂度:O(n)
这题如果换子数组的定义去掉,这题的难度就立马加大了,不知道你有没有思路?
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/su…